Cordova 使用Ratchet push.JS库执行多个JS文件
我正在开发一个带有Ratchet2.0.2的Phonegap应用程序,使用push.js在页面之间进行转换。一切都进展顺利,但几个小时前我偶然发现: 包含JavaScript的脚本标记将不会在 都加载了push.js。如果您想附加事件 其他页面上元素的处理程序,文档级事件委派 这是一个常见的解决方案 在做了更多的研究后,我发现: 这与我遇到的问题几乎相同,但我需要更进一步,因为我不仅需要加载一个脚本,还需要加载两个(将来可能还会更多),如何利用checkPage()加载多个脚本Cordova 使用Ratchet push.JS库执行多个JS文件,cordova,phonegap-build,ratchet-2,push.js,Cordova,Phonegap Build,Ratchet 2,Push.js,我正在开发一个带有Ratchet2.0.2的Phonegap应用程序,使用push.js在页面之间进行转换。一切都进展顺利,但几个小时前我偶然发现: 包含JavaScript的脚本标记将不会在 都加载了push.js。如果您想附加事件 其他页面上元素的处理程序,文档级事件委派 这是一个常见的解决方案 在做了更多的研究后,我发现: 这与我遇到的问题几乎相同,但我需要更进一步,因为我不仅需要加载一个脚本,还需要加载两个(将来可能还会更多),如何利用checkPage()加载多个脚本 var chec
var checkPage = function(){
//Only run if twitter-widget exists on page
if(document.getElementById('twitter-widget')) {
loadTwitterFeed(document,"script","twitter-wjs");
}
};
window.addEventListener('push', checkPage);
更新:另见
这里有一个解决方案,我已经尝试过,它似乎工作正常,但我正在寻找一些反馈,如果这是最好的方法或不是。。。请随时发表评论,我将根据需要进行更新。我知道eval()
在索引\第一页上,将以下脚本放置在页面底部,.content
div的外部,这样它就不会被push.js
覆盖
<script>
window.addEventListener('push', function(){
var scriptsList = document.querySelectorAll('script.js-custom');
for(var i = 0; i < scriptsList.length; ++i) {
eval(scriptsList[i].innerHTML);
}
});
</script>
第一个脚本将使用.js custom
类查找并循环任何
标记,并使用eval()
执行其内容这是我的push.js加载脚本版本,根据Danito的回答改编
我对html和js文件有1:1的关系。将有一个thinga.html和thinga.js文件。我决定在html的content div中添加thinga的id,如下所示:
<div class="content" id="thinga">
...
</div>
checkPage函数从content div获取id并检查是否存在同名的javascript文件,如果存在,则使用jQuery的$.getScript()从scripts/
目录加载它
var checkPage = function(){
var elm = document.getElementsByClassName("content")[0];
var script = elm.id;
if(script) {
$.getScript("scripts/"+elm.id+".js")
.done(function( script, textStatus ) {
console.log( textStatus );
})
.fail(function( jqxhr, statusText, errorThrown ) {
console.log(errorThrown);
console.log(statusText);
console.log(jqxhr);
});
}
};
至少在我的用例中,这似乎起到了作用。我只是想把它扔掉,希望有一天它能帮助别人。在使用push.js时,我找到了解决这个问题的方法。最后我做的是给我想要加载的每个html页面一个#描述。这意味着当我链接到页面时,我会链接到contactlist.html#contact
在我的html主页面上,我添加了事件侦听器:
window.addEventListener('push', pageHandler);
然后在一个单独的文件中运行这个脚本
var pageHandler= function(){
var page= window.location.hash;
if (page == '#contact'){
//Put every script you want to use on this page here.
}
if(page == '#info'){
//Same here, every script you need for this page.
}
};
我不知道这是否是最好的方法,但我觉得我可以很好地控制我的脚本,而且它很有效 把我的想法放在这里。我对Ratchet.js做了一个更改,使每个页面都可以使用单独的js。每个html都有一个链接的js文件。()
通过使用新的ratchetPro.js,我们可以做到以下几点:
(function () {
var rachetPageManager = new window.RATCHET.Class.PageManager();
rachetPageManager.ready(function () {
window.RATCHET.getScript('js/jquery.js', function () {
// Put your logic here.
});
});
})();
调用window.RATCHET.getScript加载外部js。一旦外部js被加载,它将被缓存,不再加载。但是,当页面切换时,回调将始终执行。您可以添加更多关于您尝试加载哪些脚本的详细信息吗?\execute?Sure@Schmalzy:One是JQuery 2.0.1、handlebar.js和Phonegap加载自定义脚本时使用的默认index.js。所有文件都使用标签加载。和你的情况一样,如果我加载一个内部页面,它工作得很好,如果我从index.html加载,push.js会产生干扰。如果它们只是外部库,你仍然可以在你的索引页面上加载。而且它们仍然会有另一个页面加载。@Danito,这并不是push.js的干扰。您不应该期望加载index.html以外页面上的脚本。js用于加载内容,而不是执行脚本。谢谢Schmalzy!我将尝试一下并发布结果。未捕获的语法错误:意外标记<在这一行:eval(scriptsList[I].innerHTML);您的
是什么样子的?请注意:如果单独加载javascript文件,这将不起作用。innerHTML就是它所说的——脚本标记之间的内容只是一个提醒。Eval是邪恶的!使用时要小心。您的脚本内容(通过ajax加载)可能包含恶意代码,这些代码在您当前的环境中使用eval工作&结果将是一个完美的XSS攻击。
var pageHandler= function(){
var page= window.location.hash;
if (page == '#contact'){
//Put every script you want to use on this page here.
}
if(page == '#info'){
//Same here, every script you need for this page.
}
};
(function () {
var rachetPageManager = new window.RATCHET.Class.PageManager();
rachetPageManager.ready(function () {
window.RATCHET.getScript('js/jquery.js', function () {
// Put your logic here.
});
});
})();