Cordova 使用Ratchet push.JS库执行多个JS文件

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

我正在开发一个带有Ratchet2.0.2的Phonegap应用程序,使用push.js在页面之间进行转换。一切都进展顺利,但几个小时前我偶然发现:

包含JavaScript的脚本标记将不会在 都加载了push.js。如果您想附加事件 其他页面上元素的处理程序,文档级事件委派 这是一个常见的解决方案

在做了更多的研究后,我发现:

这与我遇到的问题几乎相同,但我需要更进一步,因为我不仅需要加载一个脚本,还需要加载两个(将来可能还会更多),如何利用checkPage()加载多个脚本

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.
        });
    });
})();