AJAX ( jQueryではなくプレーンJavaScript)を使用して、ページ(同じドメイン)を取得し、特定のDOM要素のみを表示するにはどうすればよいですか?(「bodyContent」のIDでマークされたDOM要素など)。
私はMediaWiki1.18を使用しているので、私の方法は少し慣習的ではない必要があります(jQueryのバージョンをMediaWikiで有効にできることは知っていますが、それを行うためのアクセス権がないため、他のオプションを調べる必要があります)。コードが乱雑である場合はお詫びしますが、この方法でビルドする必要がある理由があります。私は主に、Javascriptで何ができるかを知りたいと思っています。
HTMLコードは次のとおりです。
<div class="mediaWiki-AJAX"><a href="http://www.domain.com/whatever"></a></div>
これが私がこれまでに持っているJavascriptです:
var AJAXs = document.getElementsByClassName('mediaWiki-AJAX');
if (AJAXs.length > 0) {
for (var i = AJAXs.length - 1; i >= 0; i--) {
var URL = AJAXs[i].getElementsByTagName('a')[0].href;
xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
AJAXs[i].innerHTML = xmlhttp.responseText;
}
}
xmlhttp.open('GET',URL,true);
xmlhttp.send();
}
}
編集:
lbstrの回答のおかげで、私は次のことを思いつくことができました。不要な要素を削除するために、追加の手順を追加したことに気付くでしょう。何らかの理由で、getElementById()はresponseTextで機能しませんでしたが、getElementsByClassName()は機能しました。これは、AJAX呼び出しが実行される前に、「bodyContent」のIDがwikiページにすでに存在しているためだと思います。
//This function is necessary to read the response text correctly.
function outerHTML(node){
// if IE, Chrome take the internal method otherwise build one
return node.outerHTML || (
function(n){
var div = document.createElement('div'), h;
div.appendChild( n.cloneNode(true) );
h = div.innerHTML;
div = null;
return h;
})(node);
}
// This code deals with populating the AJAX divs within a wiki page.
var AJAXs = document.getElementsByClassName('mediaWiki-AJAX');
if (AJAXs.length > 0) {
for (var i = AJAXs.length - 1; i >= 0; i--) {
(function(index){
var URL = AJAXs[index].getElementsByTagName('a')[0].href;
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
var tempDiv = document.createElement('div');
tempDiv.innerHTML = xmlhttp.responseText;
var AJAXContent = tempDiv.getElementsByClassName('mw-content-ltr')[0];
//Remove unnecessary "fixed" items to avoid clutter.
var hiddenItems = AJAXContent.getElementsByClassName('hidden-item');
if (hiddenItems.length > 0) {
for (var j = hiddenItems.length - 1; j >= 0; j--) {
AJAXContent.removeChild(hiddenItems[j]);
}
}
var protectedItems = AJAXContent.getElementsByClassName('protected-item');
if (protectedItems.length > 0) {
for (var j = protectedItems.length - 1; j >= 0; j--) {
AJAXContent.removeChild(protectedItems[j]);
}
}
//Insert the AJAX content and rerun Javascript on it.
if (AJAXContent !== null && AJAXContent !== undefined) {
AJAXs[index].innerHTML = outerHTML(AJAXContent);
assign_Popup_Functions(AJAXs[index]);
fix_External_Links(AJAXs[index]);
assign_iFrame_Functions(AJAXs[index]);
}
}
}
xmlhttp.open('GET',URL,true);
xmlhttp.send();
})(i);
}
}