在开发过程中,jQueryhtml() 是获取当前节点下的html代码,并不包含当前节点本身的代码,然而我们有时候的确需要,可以通过jQueryprop("outerHTML")的方式设置。
很多jQuery的使用者都对这一问题深感疑惑。为什么在众多方便的各种获取属性和设置属性的方法中就不能像DOM中一样直接设置html元素的outerHTML呢?
因为原生JS DOM里有一个内置属性 outerHTML (看清大小写哦,JS是区分大小写的)用来获取当前节点的html代码(包含当前节点),所以用jQuery的prop()能拿到
一、jquery获取outerhtml
<div class="test"><p>hello,你好!</p></div><script>
$("test")prop("outerHTML");
</script>
二、jquery设置outerhtml
$('test'
)prop(
'outerHTML'
,
'<input>'
);
CString GetMacAddress()
/
通过WMI取第一块活动网卡地址,事先需要调用过CoInitialize()初始化COM
/
{
HRESULT hRes;
hRes = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
if (FAILED(hRes))
return _T("");
IWbemLocator pLoc = NULL;
hRes = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID)&pLoc);
if (FAILED(hRes))
return _T("");
IWbemServices pSvc = NULL;
hRes = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0,
NULL, 0, 0, &pSvc);
if (FAILED(hRes))
{
pLoc->Release();
return _T("");
}
hRes = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,
NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_DEFAULT);
if (FAILED(hRes))
{
pSvc->Release();
pLoc->Release();
return _T("");
}
IEnumWbemClassObject pEnumerator = NULL;
hRes = pSvc->ExecQuery(_bstr_t(L"WQL"),
_bstr_t(L"SELECT FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = TRUE"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL, &pEnumerator);
if (FAILED(hRes))
{
pSvc->Release();
pLoc->Release();
return _T("");
}
CString szMacAddress = _T("");
while (true)
{
IWbemClassObject pclsObj = NULL;
ULONG uReturn = 0;
hRes = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if (FAILED(hRes) || !uReturn)
break;
VARIANT vtProp;
VariantInit(&vtProp);
if (SUCCEEDED(pclsObj->Get(L"MACAddress", 0, &vtProp, 0, 0)))
{
if (V_VT(&vtProp) == VT_BSTR)
{
szMacAddress = vtPropbstrVal;
VariantClear(&vtProp);
pclsObj->Release();
break;
}
VariantClear(&vtProp);
}
pclsObj->Release();
}
pEnumerator->Release();
pSvc->Release();
pLoc->Release();
return szMacAddress;
}
------解决方案--------------------奥,那个DLL大概在02年左右整理的好像,时间太久了,应该是不支持vsita的,楼主看看这段代码是否有用?我是拷贝来的:/ //函数名称:GetDriverInfomation //函数功能:得到驱动器的信息 //参数1:bAlpha - BYTE型,驱动器的代号A-Z(a-z) //参数2:iGTI_TYPE - int,将要获取的驱动器信息类型 // GDI_VOLUMENAME 得到驱动器名字 // GDI_VOLUMESERIALNUMBER 得到驱动器序列号 // GDI_VOLUMEFILESYSTEM 得到驱动器文件系统 // GDI_VOLUMETYPE 得到驱动器类型 // GDI_VOLUMESIZE 得到驱动器总大小 // GDI_VOLUMEFREESIZE 得到驱动器剩余大小 //返回值:CString型,所要得到的驱动器信息的字符串表达 //例子:得到C盘的名字GetDriverInfomation('C',GDI_VOLUMENAME) / #define GDI_VOLUMENAME 0 #define GDI_VOLUMESERIALNUMBER 1 #define GDI_VOLUMEFILESYSTEM 2 #define GDI_VOLUMETYPE 3 #define GDI_VOLUMESIZE 4 #define GDI_VOLUMEFREESIZE 5 CString GetDriverInfomation(BYTE bAlpha,int iGTI_TYPE) { CString strResult = _T("");
JS中attr和prop属性的区别
相比attr,prop是161才新出来的,两者从中文意思理解,都是获取/设定属性的方法(attributes和properties)。只是,window或document中使用attr()方法在jQuery16之前不能正常执行,因为window和document中不能有attributes。prop应运而生了。
既然我们想知道他们两的区别,最好就看看他们的原始码,不要被程式码长度所吓到,我们只看关键的几句:
attr: function( elem, name, value, pass ) {
var ret, hooks, notxml,
nType = elemnodeType;
don't get/set attributes on text, ment and attribute nodes
if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
return;
}
if ( pass && jQueryisFunction( jQueryfn[ name ] ) ) {
return jQuery( elem )[ name ]( value );
}
Fallback to prop when attributes are not supported
if ( typeof elemgetAttribute === "undefined" ) {
return jQueryprop( elem, name, value );
}
notxml = nType !== 1 || !jQueryisXMLDoc( elem );
All attributes are lowercase
Grab necessary hook if one is defined
if ( notxml ) {
name = nametoLowerCase();
hooks = jQueryattrHooks[ name ] || ( rbooleantest( name ) boolHook : nodeHook );
}
if ( value !== undefined ) {
if ( value === null ) {
jQueryremoveAttr( elem, name );
return;
} else if ( hooks && "set" in hooks && notxml && (ret = hooksset( elem, value, name )) !== undefined ) {
return ret;
} else {
elemsetAttribute( name, value + "" );
return value;
}
} else if ( hooks && "get" in hooks && notxml && (ret = hooksget( elem, name )) !== null ) {
return ret;
} else {
ret = elemgetAttribute( name );
Non-existent attributes return null, we normalize to undefined
return ret === null
undefined :
ret;
}
}
prop方法程式码(jQuery版本183)
prop: function( elem, name, value ) {
var ret, hooks, notxml,
nType = elemnodeType;
don't get/set properties on text, ment and attribute nodes
if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
return;
}
notxml = nType !== 1 || !jQueryisXMLDoc( elem );
if ( notxml ) {
Fix name and attach hooks
name = jQuerypropFix[ name ] || name;
hooks = jQuerypropHooks[ name ];
}
if ( value !== undefined ) {
if ( hooks && "set" in hooks && (ret = hooksset( elem, value, name )) !== undefined ) {
return ret;
} else {
return ( elem[ name ] = value );
}
} else {
if ( hooks && "get" in hooks && (ret = hooksget( elem, name )) !== null ) {
return ret;
} else {
return elem[ name ];
}
}
}
attr方法里面,最关键的两行程式码,elemsetAttribute( name, value + “” )和ret = elemgetAttribute( name ),很明显的看出来,使用的DOM的API setAttribute和getAttribute方法 *** 作的属性元素节点。而prop方法里面,最关键的两行程式码,return ( elem[ name ] = value )和return elem[ name ],你可以理解成这样documentgetElementById(el)[name] = value,这是转化成JS物件的一个属性。
既然明白了原理是这样,我们来看看一个例子:
<input type=checkbox id="test" abc="111" />
$(function(){
el = $("#test");
consolelog(elattr("style")); undefined
consolelog(elprop("style")); CSSStyleDeclaration物件
consolelog(documentgetElementById("test")style); CSSStyleDeclaration物件
});
elattr(“style”)输出undefined,因为attr是获取的这个物件属性节点的值,很显然此时没有这个属性节点,自然输出undefinedelprop(“style”)输出CSSStyleDeclaration物件,对于一个DOM物件,是具有原生的style物件属性的,所以输出了style物件至于documentgetElementById(“test”)style和上面那条一样
接着看:
elattr("abc","111")
consolelog(elattr("abc")); 111
consolelog(elprop("abc")); undefined
首先用attr方法给这个物件新增abc节点属性,值为111,可以看到的结构也变了
elattr(“abc”)输出结果为111,再正常不过了elprop(“abc”)输出undefined,因为abc是在这个的属性节点中,所以通过prop是取不到的
elprop("abc", "222");
consolelog(elattr("abc")); 111
consolelog(elprop("abc")); 222
我们再用prop方法给这个物件设定了abc属性,值为222,可以看到的结构是没有变化的。输出的结果就不解释了。
上面已经把原理讲清楚了,什么时候用什么就可以自己把握了。
提一下,在遇到要获取或设定checked,selected,readonly和disabled等属性时,用prop方法显然更好,比如像下面这样:
<input type=checkbox id="test" checked="checked" />consolelog(elattr("checked")); checked
consolelog(elprop("checked")); true
consolelog(elattr("disabled")); undefined
consolelog(elprop("disabled")); false
显然,布林值比字串值让接下来的处理更合理。
PS一下,如果你有JS效能洁癖的话,显然prop的效能更高,因为attr需要访问DOM属性节点,访问DOM是最耗时的。这种情况适用于多选项全选和反选的情况。
大家都知道有的浏览器只要写disabled,checked就可以了,而有的要写成disabled = "disabled",checked="checked",比如用attr("checked")获取checkbox的checked属性时选中的时候可以取到值,值为"checked"但没选中获取值就是undefined。
jq提供新的方法“prop”来获取这些属性,就是来解决这个问题的,以前我们使用attr获取checked属性时返回"checked"和"",现在使用prop方法获取属性则统一返回true和false。
那么,什么时候使用attr(),什么时候使用prop()?1新增属性名称该属性就会生效应该使用prop();2是有true,false两个属性使用prop();3其他则使用attr();专案中jquery升级的时候大家要注意这点!
window或document中使用attr()方法在jQuery16中不能正常执行,因为window和document中不能有attributes。它们包含properties(比如:location或readyState)
举个简单的例子取值prop('checked')false布林值attr('checked')undefind获取的是字串赋值prop('new-attr',true)attr('new-attr',true)再次获取的prop还是布林值attr还是字串
window或document中使用attr()方法在jQuery16中不能正常执行,因为window和document中不能有attributes。它们包含properties(比如:location或readyState),必须使用prop()方法 *** 作或简单地使用javascript原生的方法。 在jQuery161中,wind
window或document中使用attr()方法在jQuery16中不能正常执行,因为window和document中不能有attributes。它们包含properties(比如:location或readyState),必须使用prop()方法 *** 作或简单地使用javascript原生的方法。 在jQuery161中,window和document中使用attr()将被自动转成使用prop(还没试过)。其次,checked,selected和前面提到的其它boolean attributes,因为这些attributes和其相应的properties之间的特殊关系而被特殊对待。通常,attribute 就是以下程式码中看到的,如:
<input type=”checkbox” checked=”checked”>
但它仅表示checked属性在页面载入的时候被设定成预设值或初始值,而不管checkbox元素是否被选中。 而通常 properties 是一个浏览器用来记录当前属性值的东西。正常情况下,properties反映它们相应的attributes。
所以,当用户点选一个checkbox元素或选中一个select元素的一个option时,使得properties保持最新,但对应的attributes却不一定,它仅被浏览器用来储存该属性的初始值。
对于HTML元素本身就带有的固有属性,在处理时,使用prop方法。
对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法。
举例:
<a href="#" id="link1" action="delete">删除</a>
这个例子里<a>元素的DOM属性有“href、id和action”,很明显,前两个是固有属性,而后面一个“action”属性是我们自己自定义上去的,<a>元素本身是没有这个属性的。
因此获取action使用attr方式获取,其他需要通过prop方式获取
补充:
在jquery16之前的所有版本中都使用attr方法来获取
组成他们的字母不同
拼写不同
读音不同
看起来不同
"1、利用标签名获取元素
$(""标签名"")
2、通过ID获取元素
$(""#id_name"")
3、通过 类名获取元素
$(""className"")
4、一次性获取多个元素
$(""元素名, 元素名, 元素名 "")
5、通过指定层次关系获取元素
$(""祖先 子孙"")
$(""父 > 子"")
$(""前 + 后"")
$(""兄 ~ 弟"")
6、根据元素的属性值获取元素
[attribute]
[attribute = value]
[attribute != value]
[attribute ^= value]
[attribute $= value]
[attribute = value]"
当点击id为selectBar的dom时,执行括号总的函数。函数执行的 *** 作是找到当前窗口中所有类型为checkbox但id不等于selectBar的input标签,然后将这些标签的checked属性设置成id为selectBar的checked属性。说白了就是将id不等于selectBar的checkbox的选中情况设置成跟id等于selectBar的一致。prop是吧选中的对象的名字叫第一个参数的属性的值设置成第二个参数。如果只有一个参数是取这个对象的属性的值
Prop
的大小写
(camelCase
vs
kebab-case)
HTML
中的特性名是大小写不敏感的,所以浏览器会把所有大写字符解释为小写字符。这意味着当你使用
DOM
中的模板时,camelCase
(驼峰命名法)
的
prop
名需要使用其等价的
kebab-case
(短横线分隔命名)
命名:
Vuecomponent('blog-post',
{
//
在
JavaScript
中是
camelCase
的
props:
['postTitle'],
template:
'<h3>{{
postTitle
}}</h3>'
})
<!--
在
HTML
中是
kebab-case
的
-->
<blog-post
post-title="hello!"></blog-post>
重申一次,如果你使用字符串模板,那么这个限制就不存在了。
静态的和动态的
Prop
像这样,你已经知道了可以像这样给
prop
传入一个静态的值:
<blog-post
title="My
journey
with
Vue"></blog-post>
你也知道
prop
可以通过
v-bind
动态赋值,例如:
<blog-post
v-bind:title="posttitle"></blog-post>
在上述两个示例中,我们传入的值都是字符串类型的,但实际上任何类型的值都可以传给一个
prop。
传入一个数字
<!--
即便
`42`
是静态的,我们仍然需要
`v-bind`
来告诉
Vue
-->
<!--
这是一个
JavaScript
表达式而不是一个字符串。-->
<blog-post
v-bind:likes="42"></blog-post>
<!--
用一个变量进行动态赋值。-->
<blog-post
v-bind:likes="postlikes"></blog-post>
传入一个布尔值
<!--
包含该
prop
没有值的情况在内,都意味着
`true`。-->
<blog-post
favorited></blog-post>
<!--
即便
`false`
是静态的,我们仍然需要
`v-bind`
来告诉
Vue
-->
<!--
这是一个
JavaScript
表达式而不是一个字符串。-->
<base-input
v-bind:favorited="false">
<!--
用一个变量进行动态赋值。-->
<base-input
v-bind:favorited="postcurrentUserFavorited">
传入一个数组
<!--
即便数组是静态的,我们仍然需要
`v-bind`
来告诉
Vue
-->
<!--
这是一个
JavaScript
表达式而不是一个字符串。-->
<blog-post
v-bind:comment-ids="[234,
266,
273]"></blog-post>
<!--
用一个变量进行动态赋值。-->
<blog-post
v-bind:comment-ids="postcommentIds"></blog-post>
传入一个对象
<!--
即便对象是静态的,我们仍然需要
`v-bind`
来告诉
Vue
-->
<!--
这是一个
JavaScript
表达式而不是一个字符串。-->
<blog-post
v-bind:comments="{
id:
1,
title:
'My
Journey
with
Vue'
}"></blog-post>
<!--
用一个变量进行动态赋值。-->
<blog-post
v-bind:post="post"></blog-post>
传入一个对象的所有属性
如果你想要将一个对象的所有属性都作为
prop
传入,你可以使用不带参数的
v-bind
(取代
v-bind:prop-name)。例如,对于一个给定的对象
post:
post:
{
id:
1,
title:
'My
Journey
with
Vue'
}
下面的模板:
<blog-post
v-bind="post"></blog-post>
等价于:
<blog-post
v-bind:id="postid"
v-bind:title="posttitle"
></blog-post>
Vue的组件中的props属性单向数据流
所有的
prop都使得其父子prop之间形成了一个单向下行绑定:父级
prop
的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。
额外的,每次父级组件发生更新时,子组件中所有的
prop
都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变
prop。如果你这样做了,Vue
会在浏览器的控制台中发出警告。
这里有两种常见的试图改变一个
prop
的情形:
这个
prop
用来传递一个初始值;这个子组件接下来希望将其作为一个本地的
prop
数据来使用。在这种情况下,最好定义一个本地的
data
属性并将这个
prop
用作其初始值:
props:
['initialCounter'],
data:
function
()
{
return
{
counter:
thisinitialCounter
}
}
这个
prop
以一种原始的值传入且需要进行转换。在这种情况下,最好使用这个
prop
的值来定义一个计算属性:
props:
['size'],
computed:
{
normalizedSize:
function
()
{
return
thissizetrim()toLowerCase()
}
}
注意在
JavaScript
中对象和数组是通过引用传入的,所以对于一个数组或对象类型的
prop
来说,在子组件中改变这个对象或数组本身将会影响到父组件的状态。
Prop
验证
我们可以为组件的
prop
指定需求。如果有一个需求没有被满足,则
Vue
会在浏览器控制台中警告你。这在开发一个会被别人用到的组件时尤其有帮助。
为了定制
prop
的验证方式,你可以为
props
中的值提供一个带有验证需求的对象,而不是一个字符串数组。例如:
Vuecomponent('my-component',
{
props:
{
//
基础的类型检查
(`null`
匹配任何类型)
propA:
Number,
//
多个可能的类型
propB:
[String,
Number],
//
必填的字符串
propC:
{
type:
String,
required:
true
},
//
带有默认值的数字
propD:
{
type:
Number,
default:
100
},
//
带有默认值的对象
propE:
{
type:
Object,
//
对象或数组且一定会从一个工厂函数返回默认值
default:
function
()
{
return
{
message:
'hello'
}
}
},
//
自定义验证函数
propF:
{
validator:
function
(value)
{
//
这个值必须匹配下列字符串中的一个
return
['success',
'warning',
'danger']indexOf(value)
!==
-1
}
}
}
})
当
prop
验证失败的时候,(开发环境构建版本的)
Vue
将会产生一个控制台的警告。
注意那些
prop
会在一个组件实例创建之前进行验证,所以实例的属性
(如
data、computed
等)
在
default
或
validator
函数中是不可用的。
类型检查
type
可以是下列原生构造函数中的一个:
String
Number
Boolean
Function
Object
Array
Symbol
额外的,type
还可以是一个自定义的构造函数,并且通过
instanceof
来进行检查确认。例如,给定下列现成的构造函数:
function
Person
(firstName,
lastName)
{
thisfirstName
=
firstName
thislastName
=
lastName
}
你可以使用:
Vuecomponent('blog-post',
{
props:
{
author:
Person
}
})
来验证
author
prop
的值是否是通过
new
Person
创建的。
非
Prop
的特性
一个非
prop
特性是指传向一个组件,但是该组件并没有相应
prop
定义的特性。
因为显式定义的
prop
适用于向一个子组件传入信息,然而组件库的作者并不总能预见组件会被用于怎样的场景。这也是为什么组件可以接受任意的特性,而这些特性会被添加到这个组件的根元素上。
例如,想象一下你通过一个
Bootstrap
插件使用了一个第三方的
组件,这个插件需要在其
上用到一个
data-date-picker
特性。我们可以将这个特性添加到你的组件实例上:
<bootstrap-date-input
data-date-picker="activated"></bootstrap-date-input>
然后这个
data-date-picker=”activated”
特性就会自动添加到<bootstrap-date-input>
的根元素上。
替换/合并已有的特性
想象一下
<bootstrap-date-input>
的模板是这样的:
<input
type="date"
class="form-control">
为了给我们的日期选择器插件定制一个主题,我们可能需要像这样添加一个特别的类名:
<bootstrap-date-input
data-date-picker="activated"
class="date-picker-theme-dark"
></bootstrap-date-input>
在这种情况下,我们定义了两个不同的
class
的值:
form-control,这是在组件的模板内设置好的
date-picker-theme-dark,这是从组件的父级传入的
对于绝大多数特性来说,从外部提供给组件的值会替换掉组件内部设置好的值。所以如果传入
type=”text”
就会替换掉
type=”date”
并把它破坏!庆幸的是,class
和
style
特性会稍微智能一些,即两边的值会被合并起来,从而得到最终的值:form-control
date-picker-theme-dark。
禁用特性继承
如果你不希望组件的根元素继承特性,你可以设置在组件的选项中设置
inheritAttrs:
false。例如:
Vuecomponent('my-component',
{
inheritAttrs:
false,
//
})
这尤其适合配合实例的
$attrs
属性使用,该属性包含了传递给一个组件的特性名和特性值,例如:
{
class:
'username-input',
placeholder:
'Enter
your
username'
}
有了
inheritAttrs:
false
和
$attrs,你就可以手动决定这些特性会被赋予哪个元素。在撰写基础组件的时候是常会用到的:
Vuecomponent('base-input',
{
inheritAttrs:
false,
props:
['label',
'value'],
template:
`
<label>
{{
label
}}
<input
v-bind="$attrs"
v-bind:value="value"
v-on:input="$emit('input',
$eventtargetvalue)"
>
</label>
`
})
这个模式允许你在使用基础组件的时候更像是使用原始的
HTML
元素,而不会担心哪个元素是真正的根元素:
<base-input
v-model="username"
class="username-input"
placeholder="Enter
your
username"
></base-input>
总结
以上所述是小编给大家介绍的Vue组件中prop属性使用说明,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
您可能感兴趣的文章:VueJs组件prop验证简单介绍Vue组件选项props实例详解vue父组件通过props如何向子组件传递方法详解详解vue2父组件传递props异步数据到子组件的问题详解vue父子组件间传值(props)Vue20利用
v-model
实现组件props双向绑定的优美解决方案
以上就是关于怎样用jQuery自带方法/函数来获取outerHTML属性全部的内容,包括:怎样用jQuery自带方法/函数来获取outerHTML属性、VC怎么获取硬件ID,CPU,硬件,网卡等、JS中attr和prop属性的区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)