3

私のアプリは、 jQuery.getScript()を使用して外部 JavaScript ファイルをロードしています。ブックマークレットまたは拡張機能を使用してアプリを起動すると、すべて正常に動作します。KBX 拡張機能を使用してChrome内に KBX を介してアプリをインストールすると、javascript ファイル内に含まれる関数にコールバックでアクセスできなくなり、 : Uncaught ReferenceError: myfunc is not defined が表示されます。

含まれている機能にアクセスするためのトリックはありますか?

ブックマークレット: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 経由でインストールするための URL : 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');
                };
                */
            }
        );

        |>
    }  
  }
}
4

3 に答える 3

3

あなたの問題が、KBX がコードを実行するサンドボックス環境と関係があるかどうかは完全にはわかりませんが、そうかもしれません。これは、KBX http://geek.michaelgrace.org/2011/03/kynetxs-new-sandboxed-browser-extensions/のサンドボックス環境の取り扱いについて書いた投稿です。

ブログ投稿より

最近、「昔ながらのリツイート」Kynetx アプリをリリースしました新しくリリースされたブラウザ拡張機能については、Kynetx アプリ ストアで。私は新しい拡張機能と、それらがユーザーと開発者のために行うすべてのことを非常に気に入っています。アプリ ストアでアプリをリリースしたときに忘れていたのは、新しい拡張機能がサンドボックス化されていることです。拡張機能はサンドボックス化されているため、拡張機能のすべてのスクリプトは、以前の Kynetx 拡張機能で使用されていたものとは少し異なる方法で実行されます。技術的な詳細にはあまり触れずに、以前の拡張機能は JavaScript をページに挿入しただけで、新しい拡張機能は DOM にアクセスできるサンドボックスで JavaScript を実行しますが、ページ上の他のものにはアクセスできません。この変更により、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);
}
于 2011-04-13T18:04:24.203 に答える
1

サンドボックスの外で自分のものにアクセスできるようにするためにできるもう1つのことは、ウィンドウレベルで自分のものを宣言することです(サンドボックスの目的を損なうため、お勧めしません)。例:サンドボックス内でconsole.logを実行する場合、console.logはウィンドウコンソールに記録されません。しかし、window.console.logと言えば、そうなります。したがって、次の方法でvarを宣言できます(ただし、宣言すべきではありません)。

window.myvar = "MyValue";

これにより、変数はウィンドウレベルの変数になります。私はこれに反対して説教していますが、テストのために1、2回行いました。

于 2011-04-14T05:10:34.023 に答える
1

だから... FFとChromeの両方でうまくいくことをしただけです。きれいではありませんが、実際にはどれもそうではありません。FF と Chrome で異なる動作をする必要がなく、両方に 1 つの回避策があるのは良かったです。グローバル オブジェクトから値を取得する必要がありましたが、サンドボックスがそれをブロックしていました。このハックにより、両方のブラウザーで 1 つの方法でそれを行うことができました。

まず、サンドボックス内から... document.body の下部に非表示の div を追加します

$K('body').append('<div id="randomdiv" style="display:none;"></div>');

次に、randomdiv のテキストを必要な値に設定するスクリプトを document.head に作成します。

var temp = '$("#randomdiv").text(twttr.currentUserScreenName);';    
var somescript = document.createElement("script");
somescript.innerHTML = temp;
document.getElementsByTagName("head")[0].appendChild(somescript);

次に... この時点で、サンドボックス内から、グローバル js オブジェクトではなく、DOM から値を選択できます。これはあなたがそれを行う方法です。

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

あなたの考えを聞かせてください。これが私にとって最も簡単だったものです。

于 2011-05-23T06:02:07.910 に答える