Привязка jQuery после.load и.getScript работает только после предупреждения
Вот один для вас jQuery Ajax мастера. Используя jQuery 1.7.2, но также попробовал 1.5.1...
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
Главная страница загружает внешний (тот же домен) файл JS. В обратном вызове из события щелчка я делаю AJAX-вызов для входа в систему, отправив форму входа. На основе параметров, переданных обратно (JSON) из вызова аутентификации, я выполняю загрузку некоторого содержимого и панели навигации в основной документ.
$("#loginForm_submit").click(function() {
var action = $("#loginForm").attr('action');
var form_data = {
sbgusername: $("#sbgusername").val(),
sbpassword: $("#sbpassword").val()
};
$.ajax({
type: "POST",
url: action,
data: form_data,
success: function(loginData){
if(loginData.success == true){
// this will be moved into a loop to laod multiple apps into one page. For testing
// all arrays only have value
var webapps = loginData.webapps; //array
var webappservers = loginData.webappservers; //array
var webappscripts = loginData.webappscripts; //array
var webAppContent = webappservers[0] + ' #' + webapps[0] + 'Content';
// webAppContent = 'api/wpapp.cfm #wpContent';
var webAppNav = webappservers[0] + ' #' + webapps[0] + 'Nav';
// webAppNav = 'api/wpapp.cfm #wpNav';
var scriptURL = webappscripts[0];
// scriptURL = 'api/wpBase.js';
var scriptLoad = webapps[0] + 'Load';
// scriptLoad = 'wpLoad';
$("#sbcore").load(webAppContent); //sbcore is div in main document
$("#nav").load(webAppNav); //nav is div in main document
$.ajaxSetup({ cache: false },{async:false});
$.getScript(scriptURL, function(data, textStatus, jqxhr) {
window[scriptLoad](); //because getScript loads methods into global context from what I can tell
});
$.ajaxSetup({ cache: false },{async:true});
}
else
{ alert(loginData.message);
}
},
error: function(errorData){
alert("Server couldn't be reached. Please Try again.");
}
});
return false;
});
Загруженная навигационная панель выглядит так:
<div id="menu">
<ul>
<li id="nw-menu-dashboard" class="first"><a href="#" accesskey="1" title="">Home</a></li>
<li ><a id="nw-menu-privatearticles" href="#" accesskey="2" title="">Articles</a></li>
</ul>
JS, загруженный scriptLoad как scriptURL, выглядит следующим образом (обратите внимание, что он загружен из того же домена):
function nwLoad() {
//alert("nwBase.js ran");
nwLoadMenu();
}
function nwLoadMenu() {
//alert("here");
$("#nw-menu-dashboard").on("click",function() {
//e.preventDefault();
alert("doDashboard");
});
$("#nw-menu-privatearticles").on("click",function() {
//e.preventDefault();
alert("doPrivateArticles");
});
}
Так что это странная вещь, если я раскомментирую //alert("nwBase.js ran");
или //alert("here");
в приведенном выше меню меню привязываются к элементам div, а оповещения о щелчках меню работают по желанию. Но, как и выше, без предупреждений до привязок это не работает. Я пытался связать, используя.click,.live,.
Я пытался загрузить синхронно, ждать и т. Д. И не могу заставить его работать. Есть идеи?
2 ответа
Я предлагаю вам снова попробовать бит ожидания с помощью обратного вызова (вместо setTimeout
).
Это не связано, что после раскомментирования alert
функционировать все так, как вам нужно.
Потому что за это время, пока вы не нажали кнопку OK, ваше меню загрузилось, и ваша функция CLICK связалась правильно.
позвони nwLoadMenu
функция, когда придет ответ - используйте функцию обратного вызова или отложенный объект!