主要な 5 つのブラウザー (Chrome 1+、IE 6+、Firefox 1+、Safari 3+、Opera 9+正確なバージョンを覚えていない)用に設計された、一種の REPL をページに追加するブックマークレットを作成しました。 .
コードを評価するコア コンポーネントは以下に掲載されており、わずかに変更され、注釈が付けられています。
/**
* Evaluates some code in the global scope.
* @param String code: Code to eval
* @return Stringified result, prefixed with 'E:' if error.
*/
function globalEval(/*string*/ code) {
var win = window, r, raw;
try {
if (win.execScript) { // eval in IE sucks, so use execScript instead
r = win.$_$_$globalEval$_$_$ = {c:code};
win.execScript('try{$_$_$globalEval$_$_$.r=eval($_$_$globalEval$_$_$.c);}catch(e){$_$_$globalEval$_$_$.e=e}');
// /*Optional clean-up:*/ delete win.$_$_$globalEval$_$_$;
if (r.e) throw r.e; // Error
raw = r.r;
} else {
raw = win.eval(code);
}
r = '' + raw; // Stringify in the try-block
// It is possible that an error is thrown
// for example, for the following code: ({toString:1})
} catch(err) {
r = (err + ''); // Convert error to string
// IE: If found, "[object" will be at index zero, which is falsy
if (!r.indexOf('[object')) r = err.message;
// r =
r = 'E:' + (raw=r);
} finally {
// raw = unmodified result (or Error instance)
// FOR THIS EXAMPLE, raw is not used, and string r is returned
return /*string*/ r;
}
}
入力 + 出力テキスト領域を含むいくつかのコントロールを含むフォームに機能を実装しました。
注: コードはグローバル コンテキストで評価されます。そのため、変数はすべてcode
グローバルスコープにリークされます。インタープリターの場合、iframe を使用して新しいスコープを作成 (およびvar win
関数で変更) できます。
var win = frames['name_of_frame'], ... // or
var win = frame_DOM_element.contentWindow, ...