我一直在研究一些JavaScript,到目前为止最令人沮丧的事情之一是,如果使用Back,Forward或Hard Refresh,我的JavaScript似乎拒绝加载。考虑到我的网站建立在通过MySQL数据库连接重复生成的静态HTML页面上,我不得不手动添加主持人菜单,但有时似乎只是拒绝出现?
if (getCookie('opt23') !== '1') {
var ajaxtwo = new XMLHttpRequest();
var wrap = '';
if (document.getElementById("firstpage") !== null) {
wrap = document.getElementById("firstpage");
} else {
wrap = document.getElementById("firstpageinside");
}
var main = document.createElement("div");
main.setAttribute("id","modmenu");
wrap.appendChild(main);
ajaxtwo.onreadystatechange = function() {
var reports = (ajaxtwo.responseText === '0' ? 'flagblue.png' : 'flag.png');
reportcount.innerHTML = '<img src=' + ku_cgipath + '/css/images/mods/' + reports + ' style="height:15px;' +
'width:15px;" />' + ajaxtwo.responseText;
};
ajaxtwo.open("GET",ku_cgipath + "/manage_page.php?action=reports&count",true);
ajaxtwo.send();
var threadid = document.getElementsByName("replythread");
// taking the initiative of togglePassword, this makes things less needlessly lengthy.
main.innerHTML =
'<h2>Quick Mod</h2>' +
'<input type="hidden" name="threadid" value="' + threadid[0].value +'" />' +
'<label for="modaction">Action </label><select id="action" name="modaction">' +
'<option value=""><none></option>' +
'<option value="delpost">Delete posts</option>' +
'<option value="rebuildone">Rebuild board</option>' +
'<option value="bans">View Bans</option>' +
'<option value="appeals">View Appeals</option>' +
'<option value="stickypost">Sticky Thread</option>' +
'<option value="unstickypost">Unsticky Thread</option>' +
'<option value=lockpost>Lock Thread</option>' +
'<option value="unlockpost">Unlock Thread</option>' +
'<option value="bump">Instant Bump</option>' +
'<option value="viewthread">Switch to Moderator View</option>' +
'</select>' +
'<input type="submit" name="submit" value="Submit">' +
'<a href="' + ku_cgipath + '/manage_page.php?action=reports" target="_blank">' +
'<span id="reportcount"></span></a> ';
}
我的第二个问题是另一个JavaScript,我正在尝试使这些HTML页面动态运行。我正在使用AJAX与PHP脚本进行交互,但是,当它带回页面时(基本上是在下一页并使用CSS将它绑在第一页旁边,创建一个'duo view'),我的JavaScript不会获得应用,如时间设置或生成的链接。如何应对?我不能使用window.onload
,因为它只能使用一次 - 它在另一个JavaScript中使用。我只是以某种方式修改PHP文件的结果吗?我正在使用正则表达式来抓取下一页,所以我实际上无法在PHP中修改结果......我可以吗?
愿意承认大多数解决方案,包括改写。
答案 0 :(得分:4)
这是一个小小的JavaScript&#34; 问题&#34;由浏览器的后台缓存引起的!我已经回复了similar question,但为了完整起见,这是解决方案:
Firefox和iOS Safari是唯一一个(在撰写本文时)已知来解决此问题的人。解决方案是挂钩window.unload
事件,以及在window.onpageshow
内重新加载页面的特定条件!
jQuery的:
$(window).unload(function () { $(window).unbind('unload'); });
JavaScript的:
function UnloadHandler() { window.removeEventListener('unload', UnloadHandler, false); }
window.addEventListener('unload', UnloadHandler, false);
jQuery的:
$(window).bind('pageshow', function(event) {
if (event.originalEvent.persisted) {
window.location.reload()
}
});
JavaScript的:
window.addEventListener('pageshow', function (event) {
if (event.persisted) {
window.location.reload()
}
}, false);
你可以实际上使用多个脚本/多个函数挂钩onload
事件。而不是使用覆盖形式的事件,例如ajaxtwo.onreadystatechange
- 你应该"add" an event listener。
简单的例子是:
ajaxtwo.addEventListener('readystatechange', function () {
alert("hi! I'm done!");
}, false);
至于辅助功能,它将为你做到这一点&#34;向后兼容一些旧版本的Internet Explorer;你可以使用这个简单的功能:
function AttachEventListener(element, event, handler) {
if (element.addEventListener) {
element.addEventListener(event, handler, false);
} else if (element.attachEvent) {
element.attachEvent('on' + event, handler);
} else {
alert('Invalid element specified for AttachEventListener');
}
}
用法:
AttachEventListener(ajaxtwo, 'readystatechange', function () {
alert("hi! I'm using an awesome helper function!");
});