Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过Chrome上的KBX扩展安装Kynetx应用程序时不工作_Javascript_Jquery_Krl - Fatal编程技术网

Javascript 通过Chrome上的KBX扩展安装Kynetx应用程序时不工作

Javascript 通过Chrome上的KBX扩展安装Kynetx应用程序时不工作,javascript,jquery,krl,Javascript,Jquery,Krl,我的应用程序正在加载带有jQuery.getScript()的外部javascript文件。当我使用bookmarklet或扩展启动应用程序时,一切正常。当应用程序通过KBX安装时,虽然在Chrome内,扩展名为KBX,但javascript文件中包含的函数在回调中不再可访问,我得到:未捕获引用错误:未定义myfunc 有什么窍门可以访问包含的功能吗? Bookmarklet:javascript:(function(){var d=document;var s=d.createElement(

我的应用程序正在加载带有jQuery.getScript()的外部javascript文件。当我使用bookmarklet或扩展启动应用程序时,一切正常。当应用程序通过KBX安装时,虽然在Chrome内,扩展名为KBX,但javascript文件中包含的函数在回调中不再可访问,我得到:未捕获引用错误:未定义myfunc

有什么窍门可以访问包含的功能吗?

Bookmarklet
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扩展:

通过KBX安装的url:

以下是规则集:

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');
                };
                */
            }
        );

        |>
    }  
  }
}
规则集a1135x30{
元{
名称“测试\u外部\u js\u加载”
说明>
作者“loic devaux”
登录
}
派遣{
域“*”
}
全球的{
}
规则优先{
当页面查看“*”设置时选择()
//前{}
//通知(“你好,世界”,“这是一个示例规则”);
{
发出
}  
}
}

我不完全确定您的问题是否与KBX运行代码的沙盒环境有关,但我认为可能是这样。这里是我写的一篇关于处理KBX沙盒环境的文章

从博客帖子 我最近在Kynetx应用商店发布了我的新浏览器扩展。我非常喜欢新的扩展以及它们为用户和开发者所做的一切。当我在应用商店发布应用程序时,我忘记了一件事,那就是新的扩展是沙盒。 由于扩展是沙盒式的,因此扩展中的所有脚本的运行方式与以前的Kynetx扩展中的略有不同。没有过多地涉及技术细节,以前的扩展只是将JavaScript注入页面,而新的扩展在沙箱中运行JavaScript,沙箱可以访问DOM,但无法访问页面上的任何其他内容。因为这个改变,我的retweet应用程序坏了,因为我使用Twitter.com加载的jQuery来打开新的tweet框(我这样做是因为Twitter.com使用该库绑定点击事件并触发该事件,它必须来自绑定它的库)。谢天谢地,在一位朋友的帮助下,我能够在Firefox和Chrome的沙盒环境中找到工作。 我是怎么做到的… 如果应用程序不是在沙箱中运行,我可以访问Twitter.com加载的jQuery来打开一个新的tweet框

$("#new-tweet").trigger("click");
在Firefox沙箱中,我可以访问沙箱外部的页面

window['$']("#new-tweet").trigger("click");
如果我在Chrome沙盒中,我可以创建一个脚本元素,其中包含我想要执行的JavaScript。虽然很粗糙,但很有效。:)

下面是当用户单击retweet按钮时执行的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);
}

另一件可以让您的东西在沙箱之外访问的事情是在窗口级别声明您的东西(违背了沙箱的目的,不推荐)。例如:如果要在沙箱中执行console.log,那么console.log不会登录到窗口控制台。但是,如果您说window.console.log,它会。因此,您可以(但不应该)通过以下方式声明var:

window.myvar = "MyValue";

这将使var成为窗口级别的var。尽管我反对这一点,但为了测试,我已经做了一两次了

所以。。。我只是做了一些对FF和Chrome都有效的事情。这并不漂亮,但这些都不是真的。这是一个很好的解决办法,而不是有一个不同的工作方式为FF比铬。我需要从全局对象获取值。。。但是沙箱挡住了它。有了这项技术,我可以用一种方法在两种浏览器上实现这一点

首先,从沙箱内部。。。将不可见的div添加到document.body的底部

$K('body').append('<div id="randomdiv" style="display:none;"></div>');
然后。。。此时,您可以从沙箱中选择DOM中的值,而不是从某个全局js对象中选择。你会这样做的

var myvar = $K('#randomdiv').text();

让我知道你的想法。这对我来说是最容易的

快速提示:KBX在沙盒环境中运行您的代码,这与从bookmarklet或单一用途浏览器扩展运行时非常不同。这种“非常不同”让我非常害怕……我这样声明函数window.myfunc=function(){console.log('running myfunc');};在包含的js文件中,使用以下命令调用函数:window.myfunc(),但我得到:Uncaught TypeError:Object[Object DOMWindow]在chrome上没有方法“myfunc”。我在FF4上测试了您的技术,它正在工作。不幸的是,我正在寻找一个解决方案的铬@亚历克斯:问题是关于铬的。上一条错误消息来自Chrome控制台。谢谢,动态脚本创建也适用于我。因此,这意味着我不能使用“脚本”数据类型将jquery ajax包含在脚本中,这是一个严重的限制,对于希望其应用程序与KBX兼容的开发人员来说,应该在前面提到,因为这个限制(可能还有其他限制)驱动了整个应用程序的开发。@Loic Devaux您是否尝试过在KRL中使用“使用资源”功能@LoicDevaux完全兼容。但是您必须知道您正在处理哪个文档。这是解决Mike遇到的一个特定问题的一种方法。Kynetx正在努力获取相关信息,并将其发布给我们的开发者社区。是的,但我不喜欢它,因为它是静态的,我需要在需要时动态加载js文件,否则我会加载所有不需要的文件。“使用资源”也不允许我在本地和本地之间轻松切换
var temp = '$("#randomdiv").text(twttr.currentUserScreenName);';    
var somescript = document.createElement("script");
somescript.innerHTML = temp;
document.getElementsByTagName("head")[0].appendChild(somescript);
var myvar = $K('#randomdiv').text();