Привет, У меня проблема с событиями onclick, которые записываются с использованием innerHTML. Я попытался сделать это двумя способами, и оба не работают
функция, которую необходимо вызвать, - это
function loadnewsstory()
{
alert("123456");
}
на данный момент он должен показать окно предупреждения с 123456, но он не стреляет.
Загрузка функции осуществляется следующим образом:
function newsstories()
{
document.getElementById("activecontent").innerHTML = "<h1 class='newsheader'>Latest News</h1>";
xmlhttp=new XMLHttpRequest();
xmlhttp.open("POST","test.com?uri=loadnews",false);
xmlhttp.send();
var newsreponse = JSON.parse(xmlhttp.responseText);
var countstories = 0;
for (var i = 0, len = newsreponse.length; i < len; ++i) {
var news = newsreponse[i];
if(i % 2 == 0){
cssclass = "even";
}
else
{
cssclass = "odd";
}
// alert(news.featured_image);
document.getElementById("activecontent").innerHTML += "<div class='news " + cssclass + "'><div class='newstitle'><div class='newstitlecolor'><a href='#' onclick='loadnewsstory();'>" + news.post_title + "</a></div></div><div class='base' style='background: url('" + news.featured_image + "');'><img src='" + news.featured_image + "' style='width:100%; height:100%;' id='news_"+ countstories +"'/></div></div>";
document.getElementById("news_"+countstories).onclick = function(){ loadnewsstory();}
countstories++;
}
}
как вы видите, я также запустил document.getElementById("news_"+countstories).onclick = function(){ loadnewsstory();}
потому что я читал, что события onclick не могут быть написаны javascript innerHTML, которые, как я знаю, я был в состоянии сделать это раньше. Если кто-то еще знает об исправлении этой проблемы, это было бы здорово. это для приложения iphone cordova
благодаря
РЕДАКТИРОВАТЬ
Я обнаружил, что это
document.getElementById("activecontent").innerHTML += "<div class='news " + cssclass + "'><a href='javascript:openextlink();'><img src='" + news.featured_image + "' style='width:100%; height:100%;'/></a></div>";
работает, но, похоже, работает только в последней новостной новость, я что-то упускаю.
это связано с тем, что z-index в моем css не работал, я исправил это, удалив z-index: -1, и теперь все работает отлично, интересно, что из-за ошибки css эта ошибка появилась зажечь
Прежде всего, добавление к innerHTML
обычно очень плохое. Если вы запустите код как something.innerHTML += 'lots of html'
в цикле, браузер должен обновить дерево DOM и повторно отобразить страницу на каждой итерации. Это может сильно замедлить работу. Вместо этого используйте буферную строку.
Я также подозреваю, что это могло вызвать проблемы с привязкой событий. Попробуйте добавить события после того, как все div
были прикреплены к дереву. Код в этом случае будет примерно таким:
function newsstories()
{
// Use a variable that would store the newly generated HTML:
var html = "<h1 class='newsheader'>Latest News</h1>";
xmlhttp=new XMLHttpRequest();
xmlhttp.open("POST","test.com?uri=loadnews",false);
xmlhttp.send();
var newsreponse = JSON.parse(xmlhttp.responseText);
for (var i = 0, len = newsreponse.length; i < len; ++i) {
var news = newsreponse[i];
// Notice the 'var' keyword!
if(i % 2 == 0){
var cssclass = "even";
} else {
var cssclass = "odd";
}
// Append to our buffer variable
html += "<div class='news " + cssclass + "'><div class='newstitle'><div class='newstitlecolor'><a href='#' onclick='loadnewsstory();'>" + news.post_title + "</a></div></div><div class='base' style='background: url('" + news.featured_image + "');'><img src='" + news.featured_image + "' style='width:100%; height:100%;' id='news_"+ i +"'/></div></div>";
}
// Now that new html is ready, insert it into the tree
// and attach events
document.getElementById("activecontent").innerHTML = html;
for (var i = 0, len = newsreponse.length; i < len; ++i) {
var img = document.getElementById('news_'+i);
if(img) img.addEventListener('click', loadnewsstory);
}
}
mousedown
? Я читал, что click
не работает в PhoneGap по умолчанию. Вы можете прочитать больше там .
Я подозреваю это, потому что ваш запрос пытается слишком быстро прочитать/проанализировать ответ с сервера:
xmlhttp.send();
var newsreponse = JSON.parse(xmlhttp.responseText);
Поскольку это запрос asyncronus (Ajax), вам нужно дать сценарию время ожидания ответа сервера. Вы делаете это, создавая обработчик событий, ожидающий ответа.
xmlhttp.onreadystatechange=function() { // checks if the state of the request has changed
if (xmlhttp.readyState==4 && xmlhttp.status==200) { // checks that the response is ready
// code to handle the response here
var newsreponse = JSON.parse(xmlhttp.responseText);
// etc.
}
}
Также обратите внимание, что вы должны создать этот обработчик перед вызовом xmlhttp.send();