スマートフォンで動かない
http://yoneyone.my-sv.net/XmlSelectBox.htm
ページですが以下のjavascriptを修正しスマートフォンで動かす事は可能でしょうか?
解決できない場合、スマートフォンで動かないjavascriptを記述していると思うのですが、
原因ってなんなのでしょうか?
以下がjavascriptです。
function xmlselectbox(id,xml_url,key,func){
var callback_func=func;
var outarea=document.querySelector(id);
var xml={};
var items=[];
var XHR= new XMLHttpRequest();
while(outarea.hasChildNodes()){
outarea.removeChild(outarea.lastChild);
}
//XMLのロード(エラー処理省略)
XHR.open("GET",xml_url,false);
XHR.send(null);
if(XHR.status == 200) xml=XHR.responseXML;
//if(xml.hasOwnProperty("SelectionLanguage")) //IEは使えない
if(typeof xml.hasOwnProperty === "undefined") //とりあえず
xml.setProperty("SelectionLanguage","XPath"); //IEにのみ必用
//最初のSELECTBOX生成
items=getitem("/descendant::node()/child::"+key,xml);
var first_contener=document.createElement("div");
var first_selectbox=document.createElement("select");
first_selectbox.setAttribute("name",key);
first_selectbox.add(new Option(key+"を選択してください","default"),null);
for(var i=0;i<items.length;i++){
first_selectbox.add(new Option(items[i].firstChild.nodeValue,items[i].firstChild.nodeValue),null);
}
//イベント追加
first_selectbox.onchange=select_change(first_selectbox,xml,outarea);
first_contener.appendChild(document.createTextNode(key+":"));
first_contener.appendChild(first_selectbox);
outarea.appendChild(first_contener);
first_selectbox.selectedIndex=0;
//SELECTBOXをどんどん作成
function select_change(selectbox,xml,outarea){
return function(){
var items=[];
items=getitem("/descendant-or-self::node()/child::" + selectbox.name
+ "[contains(self::node()/text(),'"
+ selectbox.value + "')]/child::*",xml);
/* ***********************************************************************************
normalize-space()は空白をtrimするだけ。
OK items=getitem("/descendant-or-self::node()/child::" + selectbox.name
+ "[normalize-space(self::node()/text())='"
+ selectbox.value + "']/child::*",xml);
OK items=getitem("//"+selectbox.name+"[normalize-space(./text())='"+selectbox.value+"']/*",xml);
×? items=getitem("/descendant-or-self::" + selectbox.name +"[normalize-space(.)= '"
+ selectbox.value + "']/*",xml);
*/
if(items.length>0){
if(selectbox.parentNode.nextSibling){
if(selectbox.parentNode.nextSibling.lastChild.getAttribute("name")==items[0].nodeName)
outarea.removeChild(selectbox.parentNode.nextSibling);
}
var next_contener=document.createElement("div");
var next_selectbox=document.createElement("select");
next_selectbox.setAttribute("name",items[0].nodeName);
next_selectbox.add(new Option(items[0].nodeName+"を選択してください","default"),null);
for(var i=0;i<items.length;i++){
next_selectbox.add(new Option(items[i].firstChild.nodeValue,items[i].firstChild.nodeValue),null);
}
//イベント追加
next_selectbox.onchange=select_change(next_selectbox,xml,outarea);
next_contener.appendChild(document.createTextNode(items[0].nodeName+":"));
next_contener.appendChild(next_selectbox);
if(selectbox.parentNode.nextSibling){
outarea.insertBefore(next_contener,selectbox.parentNode.nextSibling);
}else{
outarea.appendChild(next_contener);
}
next_selectbox.selectedIndex=0;
}else{
if(typeof callback_func != "undefined")
callback_func(selectbox.getAttribute("name"),selectbox.value);
}
}
}
//XPATHで検索
function getitem(xpath,xml){
var nodeValues=[];
var NodeList,Nodelength;
try{
NodeList = xml.evaluate(xpath,xml,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
}catch(e){
NodeList = xml.selectNodes(xpath);
}
Nodelength=NodeList.snapshotLength||NodeList.length;
for(var i=0;i<Nodelength;i++){
nodeValues[i]=(typeof(NodeList.snapshotItem)==='undefined')?NodeList.item(i):NodeList.snapshotItem(i);
//console.log(nodeValues[i]);
}
return nodeValues;
お礼
ありがとうございます。 おっしゃるとおり$item[0]で削除できました。 よくよく見ると「削除2」も同じ事をやっていました(^^;) ありがとうございます。 ただ、なぜ参照コピーされた$itemを$item[0]と 指定すると参照元を指定できるのが不明です。 ちなみにデバックして$item[100]などを指定しても エラーとはならず、$itemと同じ物を参照しているようです。 $itemは配列ではないと、私は思っているので $item[0]や$item[100]など使用するとエラーに なると思っていたのですがなぜこのようになるのでしょうか? たびたび質問で申し訳ありません。 宜しくお願い致します。