Djangoフォームを受け取り、javascriptを介して作成され、既存のhtmlドキュメントの本文に追加された新しいdiv要素のinnerHtmlを介してDomに挿入するブックマークレットを作成しました。最初の送信はajaxリクエストです(正常に機能します)。不明なユーザーが原因でフォームがDjangoによって拒否された場合、送信機能はajaxからバインド解除され、CORSなしでユーザーを認証するためにajaxなしでポップアップウィンドウに再送信されます。このプロセスはIEで問題なく機能しますが、送信ボタンがクリックされるとChromeタブがクラッシュします。
テスト:問題を引き起こしているのは、おそらく最初のajax送信であると思いました。ただし、インジェクション時にajaxを使用せずに同じプロセスを使用すると、送信も失敗します。インジェクションの完了後にブラウザからhtmlコードをコピーし、新しいhtmlドキュメントを作成してから、Chromeで開くと、すべて正常に機能します。また、インジェクションの前にフォームフィールドを含むdivを削除すると、送信ボタンが機能します。これは、既存のページのDomがロードされた後にフォームを挿入することと関係があると私に信じさせます。ページを更新せずにDomをリロードする方法、またはインジェクション時にinnerHtmlをDomに適切に登録する方法はありますか?
コンソールエラーはありません。このWebページの表示中に問題が発生しました。
問題を再現するには、次の手順に従います。(Chromeバージョン23.0.1271.64mのWindows8を使用しています)
(手順1)画像のURLに移動します:itsblackcurrent.com/wp-content/uploads/2012/07/what-hi.png
(ステップ2) chrome consoleに移動し、次のコードを入力します。
o = document.createElement("div");
o.setAttribute("id", "overlay");
o.innerHTML = '<div class="modal fade" id="new-pin"><div class="modal-header"><h3>New Pin</h3></div><form action="" enctype="multipart/form-data" method="get" id="ajaxform" name="pin_form" class="form-horizontal"><div class="modal-body"><div id="div_id_url" class="control-group"><label class="control-label" for="id_url">URL</label><div class="controls"><input type="text" name="url" id="id_url" /></div></div><div id="div_id_image" class="control-group"><label class="control-label" for="id_image">or Upload</label><div class="controls"><input type="file" name="image" id="id_image" /></div></div><div id="div_id_description" class="control-group"><label class="control-label" for="id_description">Description</label><div class="controls"><textarea id="id_description" rows="10" cols="40" name="description"></textarea></div></div><div id="div_id_tags" class="control-group"><label class="control-label" for="id_tags">Tags</label><div class="controls"><input type="text" name="tags" id="id_tags" /></div></div></div><div class="modal-footer"><div class="messageContainer"></div><button id="btnsubmit" type="submit" class="btn btn-primary">Submit</button><a id="cancel" onclick="removeOverlay()" data-toggle="modal" class="btn">Cancel</a></div></form></div>';
document.body.appendChild(o);
(ステップ3) [送信]をクリックして、Chromeがクラッシュするのを確認してください。
(ステップ4) DOMをロードする前にまったく同じコードをロードすると、機能します。以下を新しいテキストドキュメントに貼り付け、.htmlとして保存します。
<body>
<script>
Copy and paste all the code from step 2 here
</script>
</body>
(ステップ5) chromeで.htmlファイルを開き、送信がクラッシュしません。