我有以下代码在页面加载后动态地将jQuery加载到页面中,然后尝试运行它自己的一些jQuery。页面标题的第一个控制台日志工作。问题出现的时候,它无法在页面中找到类“special-div”并将其替换为相应的文本。有什么想法吗?
//Load jQuery library using plain JavaScript
(function(){
var newscript = document.createElement('script');
newscript.type = 'text/javascript';
newscript.src = 'https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js';
document.getElementsByTagName('head')[0].appendChild(newscript);
// Poll for jQuery to come into existance
var checkReady = function(callback) {
if (window.jQuery) {
callback(jQuery);
}
else {
window.setTimeout(function() { checkReady(callback); }, 100);
}
};
// Start polling...
checkReady(function($) {
console.log( 'jQuery is loaded on: ' + $('title').text() );
$( '.special-div' ).each(function( index ) {
console.log( index + ": " + $( this ).text() );
$( this ).replaceWith( "Say something here " + $( this ).attr( "id" ) + ' ' + $( this ).attr( "title" ) );
});
});
})();
HTML看起来像这样:
<div id="something" class="special-div" title="else"> </div>
我正在处理的古怪的CMS只允许我粘贴一个外部javascript文件,所以我必须加载jQuery和我需要的所有其他脚本通过那个文件。
修改
所以我跑了几个额外的测试并尝试了这个:
console.log( 'jQuery is loaded on: ' + $( '.special-div' ).attr( "id" ) );
我得到的回应是:
jQuery is loaded on: undefined
答案 0 :(得分:0)
如果要在第二个console.log中返回div的内容,请使用$( this ).html()
而不是$( this ).text()
答案 1 :(得分:0)
如果您想将每个$( '.special-div' )
的文字替换为其属性内容,则必须执行以下操作:
$( this ).replaceWith( "Say something here " + $( this ).attr( "id" ) + ' ' + $( this ).attr( "title" ) );
而不是
$( '.special-div' ).replaceWith( "Say something here " + $( this ).attr( "id" ) + ' ' + $( this ).attr( "title" ) );
否则你会得到所有事件的相同替代品。
答案 2 :(得分:0)
我尝试过它并且有效
但是如果你把它放在<head>
并且在它之前加载了另一个jQuery,那么DOM搜索将在DOM准备好之前运行,以便它找不到DOM。
(无window.setTimeout(function() { checkReady(callback); }, 100);
的情况)
(另一个CMS插件可能会加载jQuery)
因此,以window.onload
时间的方式运行脚本可能会更好
或者将它放在<body>
的末尾也可以。