内部に$(document).ready()
は.on('click')
イベントハンドラーがあります。これは空のdivにバインドされ、parentContainerと呼ばれます。
クリックハンドラは次のようになります。
$('#parentContainer').on('click', #buttonthatWILLexisteventually, (function() { doStuff(); }));
問題は、私が最終的に操作したいオブジェクトがまだ存在しないことです。.appendTo()jQuery関数を使用して、入力テキストフィールド、ボタン(#buttonthatWILLexisteventuallyを含む)などを#parentContainerに挿入する別の関数があります。
#buttonthatWILLexisteventally(以降#btwee)に実行させたいのは、ボタンがクリックされたときに、それに追加されたテキストフィールドの現在の値を読み取ることです。
$(document).readyをすべて削除し、意味のないHTMLを挿入して、静的HTMLに固執すると、jsfiddleで機能します。
<div class="parentContainer">
<h2>Server Log</h2>
<div>
<input type="text" name="Filter" id="logfilter" value="Filter Log by [id]" />
<input type="checkbox" id="logdebug" />
<label for="logdebug">Display Debug Messages</label>
<button class="changeNestedSetting" id="logclear">Clear</button>
<button class="changeNestedSetting" id="logview">View Log</button>
</div>
<div id="iframediv"></div>
</div>
(function () {
$(document).ready(function () {
$('.parentContainer').on('click', '#logview',(function(){
console.log($("#logfilter").val());
$('<div width="100%" height="600" id="logiframe"></div>').appendTo('div#iframediv');
var logurlparam = { filterlog: $("#logfilter").val() };
var logurl = "echo/html?ID=" + logurlparam["filterlog"];
$.ajax({
type: "GET",
url: logurl,
dataType: "html",
success: function (html) {
$('<pre>' + html + '</pre>').appendTo('div.log');
$('div#logiframe').contents().find('body').append('<pre>' + html + '</pre>');
}
});
}));
});
}());
残念ながら、実際の例ではキャッチ22が作成されているようです。クリックハンドラーを親にバインドすると、その親の内部にボタンを作成すると、クリックハンドラーがバインドされますが、テキストフィールドのコンテンツを動的に読み取ることができなくなります。値は常にデフォルト値です(http://jsfiddle.net/k5rD2/1/を参照)。一方、内部コンテンツを作成するコードと同じコードでクリックイベントを実行しようとすると、バインドされません。
これについて私が見た他のほとんどのスレッドは、入力された内容を「推測」するために.keyup()または.keypress()を使用することを推奨しています。これはかなり単純な問題に対するひどい解決策のようですが、まだ私はこれ以上良いものを見つけていません。
更新: JavaScriptプログラマーに今夜私と一緒に私のコードを調べてもらい、私が間違っていることを確認しました。私はなんとか彼を困惑させた。私たちが思いついた唯一のことは、おそらくjquery-ui(ページの他の場所で使用されている)がそれと関係があるということでしたか?