我的应用程序正在加载外部 javascript 文件jQuery.getScript()。当我使用书签或扩展程序启动应用程序时,一切正常。当应用程序通过 KBX 安装时,虽然在内部Chrome与KBX扩展javascript 文件中包含的函数无法再在回调中访问,我得到:未捕获的引用错误:myfunc 未定义 .
有什么技巧可以访问包含的功能吗?
小书签 : javascript:(function(){var d=document;var s=d.createElement('script');s.text="KOBJ_config={'rids':['a1135x30']};";d.body.appendChild(s);var l=d.createElement('script');l.src='http://init.kobj.net/js/shared/kobj-static.js';d.body.appendChild(l);})()
Chrome 扩展程序: crx
通过 KBX 安装的网址:KBX 上的应用程序
这是规则集:
ruleset a1135x30 {
meta {
name "test_external_js_loading"
description <<
debugging external loading in kbx
>>
author "loic devaux"
logging on
}
dispatch {
domain ".*"
}
global {
}
rule first_rule {
select when pageview ".*" setting ()
// pre { }
// notify("Hello World", "This is a sample rule.");
{
emit <|
$K.getScript('http\:\/\/lolo.asia/kynetx_debug/js/myfunc.js',function() {
myfunc();
/*
* myfunc.js content:
myfunc = function(){
console.log('running myfunc');
};
*/
}
);
|>
}
}
}
我不完全确定您的问题与 KBX 运行代码的沙盒环境有关,但我认为可能与此有关。这是我写的一篇关于处理 KBX 沙盒环境的文章http://geek.michaelgrace.org/2011/03/kynetxs-new-sandboxed-browser-extensions/
来自博客文章
我最近发布了我的“老派转发”Kynetx 应用程序在 Kynetx 应用商店中查找新发布的浏览器扩展。我非常喜欢新的扩展以及它们为用户和开发人员所做的一切。当我在应用程序商店中发布该应用程序时,我忘记了新扩展程序是沙盒的。
由于扩展程序是沙盒的,因此扩展程序中的所有脚本的运行方式与之前的 Kynetx 扩展程序中的运行方式略有不同。无需过多了解技术细节,以前的扩展只是将 JavaScript 注入到页面中,而新扩展在沙箱中运行 JavaScript,该沙箱可以访问 DOM,但无法访问页面上的其他任何内容。由于这一更改,我的转发应用程序崩溃了,因为我使用 Twitter.com 加载的 jQuery 来调出新的推文框(我这样做是因为 Twitter.com 使用该库来绑定单击事件并触发该事件,它必须来自绑定它的同一个库)。值得庆幸的是,在朋友的帮助下,我能够解决 Firefox 和 Chrome 的沙盒环境。
我是怎么做到的……
如果应用程序不在沙箱内运行,我只需访问 Twitter.com 加载的 jQuery 即可打开新的推文框
$("#new-tweet").trigger("click");
从 Firefox 沙箱内我可以访问沙箱外的页面
window['$']("#new-tweet").trigger("click");
如果我在 Chrome 沙箱中,我可以创建一个脚本元素,其中包含我想要执行的 JavaScript。粗糙,但有效。 :)
var trigger_click_script = document.createElement("script");
var fallback = "window['$']('#new-tweet').trigger('click');";
trigger_click_script.innerHTML = fallback;
document.getElementsByTagName("head")[0].appendChild(trigger_click_script);
这是我最终得到的 JavaScript 代码,当用户单击转发按钮时执行该代码。
// get stuff to retweet
var tweet = $K(this).parents(".tweet-content").find(".tweet-text").text();
var name = $K(this).parents(".tweet-content").find(".tweet-screen-name").text();
// build tweet
var retweet = "RT @"+name+" "+tweet;
// open new tweet box
$("#new-tweet").trigger("click");
// hack for FF sandbox
if ($("#tweet-dialog:visible").length === 0) {
window['$']("#new-tweet").trigger("click");
}
// put tweet in new tweet box
$K(".draggable textarea.twitter-anywhere-tweet-box-editor").val(retweet).focus();
$K("#tweet_dialog a.tweet-button.button.disabled").removeClass("disabled");
// hack for chrome sandbox
if ($("#tweet-dialog:visible").length === 0) {
var fallback = "window['$']('#new-tweet').trigger('click'); ";
fallback += "window['$']('.draggable textarea.twitter-anywhere-tweet-box-editor').val('"+retweet+"').focus(); ";
fallback += "window['$']('#tweet_dialog a.tweet-button.button.disabled').removeClass('disabled'); ";
var trigger_click_script = document.createElement("script");
trigger_click_script.innerHTML = fallback;
document.getElementsByTagName("head")[0].appendChild(trigger_click_script);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)