• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:動的に生成したscriptのエラーを処理する方法)

動的に生成したscriptのエラーを処理する方法

このQ&Aのポイント
  • アメブロの特殊環境に限った超マイナーケースで、スクリプトを書けるようにするプラグインを公開しています。
  • プラグインを使用する際は、<script>が有効なスペースにこのプラグインを設置し、<script>が禁止されている場所では代わりに<script>タグを使用します。
  • <script>が複数ある場合にエラーが発生した場合、このプラグインが生成した全ての<script>が動作しなくなる問題があります。例外処理やエラーの捕捉が困難な状況です。

質問者が選んだベストアンサー

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

>一つがスクリプトエラーを起こしたら、このプラグインが生成した<script>全てが動作しなくなります それぞれを別のsciriptにすれば、実行可能なようですが…?(fx16) もっとも、私の環境(IE6)では、innerHTMLでは文字列の取得ができないので、それ以前に動作しませんけれど。 そもそも、スクリプトを記述できる場所があってDOMにアクセス可能みたいなので、最初から全てのスクリプトをそこに記述するのがノーマルな発想ではないでしょうか。 body内にないと実行できないのってdocument.writeぐらいかと思いますが、それは違う記述方法にすればよいわけですから。 >appendChildをtryに入れてもcatchしません。 意味がよくわかりませんが、innerHTMLで取得しているのは文字列なので、その前後にtry{ }catch(){ }を入れれば、catchは動作しますけれど…?(fx16) とはいっても、内容がどのようなものかわからないスクリプトに対して、一律にこのような処理をすることには無理がありそう。

noname#192833
質問者

お礼

回答ありがとうございます。 fujillinさんの回答を読んでからよく確認したら、 他のスクリプトは動作していました。 結果のわかりづらいサンプルコードを使っていたので 気が付きませんでした… 本当にお恥ずかしい限りです。 IE6対応はさせていませんがinnerHTMLダメなんですね。 >そもそも、スクリプトを記述できる場所があってDOMにアクセス可能みたいなので、最初から全てのスクリプトをそこに記述するのがノーマルな発想ではないでしょうか。 普通は確かにそうです。こんなプラグインを作った理由は、 アメブロにはスクリプトタグOKスペースが半角3800字分しかないからなんです。 そこで、無難なタグなら記述できる他のスペース(半角1万字)にも スクリプトを記述できるようにしようと考えたのです。 画像以外のファイルはアップロードできないのでサーバーを借りないと jsファイルの外部化も難しいです。 このプラグインのjsファイルは私が借りてるサーバーにおいています。 appendChildをtryに入れてもcatchしません、の意味は try{ document.body.appendChild(生成したスクリプトタグ); }catch(e){ alert(e); } で構文エラーを起こしてもアラートしない、ということでした。 今読み返したら確かに訳わからない文章ですね。 申し訳ありません。 それで、新たに var text="取得したコードのテキスト"; try{ eval(text); }catch(e){ alert(e); } で構文エラーを起こしてみましたがalertしません。 ただ、他のスクリプトが動いているのでプラグインとしては問題が解決しました。 おっしゃる通り、あらゆるスクリプトへの一律処理は難しいですね。 ブログカテゴリで質問中なのですが、同じプラグインで Flash設置のための外部jsファイルのdocument.writeを実行する方法はまだ見つかっていません。 jQueryから始めてプログラム歴2ヶ月なのでわからないことだらけです。 他の質問でまたお世話になるかもしれませんのでその時はよろしくお願いします。

その他の回答 (1)

  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.1

その方式で構文エラー(パースエラー)をキャッチするのは無理だと思います 1つ1つevalで拾って行ったらいいんじゃないですか

noname#192833
質問者

補足

回答ありがとうございます。 evalをよく知らなかったので今調べてとても勉強になりました。 ただ、早速以下のようにプラグインのコードを変えて 構文エラーを起こしてみましたがアラートしません。 var text="取得したコードのテキスト"; try{ eval(text); }catch(e){ alert(e); } もしかしたら私の使い方が間違ってるだけかもしれません。

関連するQ&A

専門家に質問してみよう