怎样用jQuery自带方法函数来获取outerHTML属性

怎样用jQuery自带方法函数来获取outerHTML属性,第1张

在开发过程中,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属性的区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9326996.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存