
しごく単純な質問かもしれませんが、検索エンジン等で捜しても見つからなかったのでご教授頂けないでしょうか?(検索の仕方が悪いかもしれません。。。)
たとえば以下の簡単なjavascriptがあるとします。
<body>
<div id="test1">hogehogehoge</div>
<div>fugafugafuga</div>
<script type="text/javascript">
var obj = document.getElementById('test1');
console.log(obj.nextSibling);
</script>
</body>
この場合、nextSiblingで取得した値は次のテキストノードになってしまいます。
決めうちであれば以下のようにやってみたらうまくいきましたが、
なんだかなぁ~って感じです。
<script type="text/javascript">
var obj = document.getElementById('test1');
console.log(obj.nextSibling.nextSibling);
</script>
jQueryで言うところのsiblings()のような使い方、またはソースをご教授いただけないでしょうか?(できれば説明文も添えて頂ければ助かります)
一応jQueryのソースを読もうとしましたが、まことに恥ずかしいのですが力不足でまるで読むことができませんでした。
以上よろしくお願いいたします。
No.5ベストアンサー
- 回答日時:
#4 です。
お礼のコードを拝見しました。残念ながらあまり上手くありません…。
<p id="Sample">Sample</p>
<!-- Hello -->
<p id="Next">nextElementSibling</p>
<script type="text/javascript">
function nextElmNode(node){
var node = document.getElementById(node);
var next = node.nextSibling;
if(next && next.nodeType == 1){
return next;
}else{
while(next && next.nodeType != 1){
return next.nextSibling;
}
}
}
var targetNode = nextElmNode('Sample');
alert([targetNode.nodeName, targetNode.nodeValue].join(', ')); // #comment, Hello
</script>
#4 の function nextElementSibling で期待通りに動作すると思いますが、どうでしょうか?
(全角空白は半角空白に置換してください。そうしないと IE では動きません。IE は全角空白を WhiteSpace と見なさないからです。)
---
ElementTraversal#nextElementSibling を実装するJavaScriptライブラリを書いてみました。(IE8 で確認)
多分動かないと思いますが自信はないので一応 IE6, IE7 でも試してみてください…。
https://gist.github.com/734657
<p id="Sample">Sample</p>
<!-- Hello -->
<p id="Next">nextElementSibling</p>
<script type="text/javascript" src="../javascript/ElementTraversal.js"></script>
<script type="text/javascript">
alert(document.getElementById('Sample').nextElementSibling.id); // Next
</script>
Object.defineProperty が IE8 からサポートと予測。(MSDN にそれっぽいことが書いてありますが、英語苦手なので確証は得られず)
http://msdn.microsoft.com/en-us/library/dd548687 …
No.4
- 回答日時:
横からですが…。
#1 さんの方法だと引数 node が ELEMENT_NODE の場合に引数自身を返してしまうはずなのですが、それで上手くいったのでしょうか?
以下、サンプルコードです。
<p id="Sample">Sample</p>
<p id="Next">Next</p>
<script type="text/javascript">
var Node = 'undefined' !== typeof Node ? Node : {
ELEMENT_NODE: 1,
ATTRIBUTE_NODE: 2,
TEXT_NODE: 3,
CDATA_SECTION_NODE: 4,
ENTITY_REFERENCE_NODE: 5,
ENTITY_NODE: 6,
PROCESSING_INSTRUCTION_NODE: 7,
COMMENT_NODE: 8,
DOCUMENT_NODE: 9,
DOCUMENT_TYPE_NODE: 10,
DOCUMENT_FRAGMENT_NODE: 11,
NOTATION_NODE: 12
};
function nextElementSibling (element) {
var nextSibling;
if (element.nextElementSibling) {
return element.nextElementSibling;
}
while (nextSibling = element.nextSibling) {
if (nextSibling.nodeType === Node.ELEMENT_NODE) {
break;
}
}
return nextSibling;
}
function nextNode (node) {
while (node && node.nodeType != 1) node = node.nextSibling;
return node;
}
console.log(nextNode(document.getElementById('Sample'))); // #Sample を返す
console.log(nextElementSibling(document.getElementById('Sample'))); // #Next を返す
</script>
http://www.tagindex.com/cgi-lib/q4bbs/patio.cgi? …
ご指摘有難う御座います!
仰るとおりうまくいきませんでした。
IE9ベータとFirefoxのみ確認していましたが、
IE6だと駄目でした。
サンプルコードは今直ぐには理解できなく、申し訳ありませんが参考にさせて頂きます。
どうも有難う御座いました。
僕の現状のソースコードを一応乗せて起きます。
これで一応うまくいったような気がするのですが。。。
<script type="text/javascript">
function nextElmNode(node){
var node = document.getElementById(node);
var next = node.nextSibling;
if(next && next.nodeType == 1){
return next;
}else{
while(next && next.nodeType != 1){
return next.nextSibling;
}
}
}
window.onload = function(){
var elm = nextElmNode('test1');
// fugaが表示されれば成功かな?
alert(elm.firstChild.nodeValue);
}
</script>
<div id="test1">hoge</div>
<div>fuga</div>
No.3
- 回答日時:
No.2補足
nextElementSibling使えないのはもはやIE8以下だけみたいです。
http://www.quirksmode.org/dom/w3c_traversal.html
※IE9は使えそうです(ベータ情報ですが)
http://msdn.microsoft.com/en-us/library/ff975836 …
IE8以下が使えませんか・・・。
このリアクションで想像できてしまうかもしれませんが、
IE6対応させなきゃなんです。。。
自分の時間を割いて、色々お調べくださって本当に感謝致します。
これからもよろしくお願い申し上げます。
No.2
- 回答日時:
Firefox3.5で、
Element.nextElementSiblingと、Element.previousElementSibling
が実装されています。
https://developer.mozilla.org/En/DOM/Element.nex …
これを使えば一発かな。
console.log(obj.nextElementSibling);
No.1
- 回答日時:
実質的に次の要素を取得したいということですよね?
typeof node や node.nodeType を利用すればよいのではないでしょうか。
var obj = document.getElementById('test1');
var nobj = obj.nextSibling;
while (nobj && nobj.nodeType != 1) nobj = nobj.nextSibling;
あるいは、関数で
function nextNode(node) {
while (node && node.nodeType != 1) node = node.nextSibling;
return node;
}
みたいにしておいて、必要に応じて呼び出すとか。
有難う御座います!!!
仰るとおりにやってみたらできました。
whileやforを使ってやるんだろうなぁ~っと思ってはいたのですが、力不足でまったく実現できませんでした。
これを機会に勉強に励みます。
本当に有難う御座いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ActiveXobjectが作成できない
-
RadioButtonListの表示制御
-
WordPressのコンタクトフォーム...
-
javascript 特定のタグのidの存...
-
各ページごとにjsで表示内容を...
-
appendChildがieだとできない??
-
問題はbind の付いたリスナーを...
-
「nullまたはオブジェクトでは...
-
window.openでタイトル名の指定
-
functionから別のfunctionを実...
-
クリックすると上に開くアコー...
-
C#OpenCv V4にのエラーに関する...
-
ASP.NET MVCでObjectをjsに渡す
-
jQueryの :not() .not() が有効...
-
getElementByIdを使用したグロ...
-
javascriptの基本的なことだと...
-
処理前の「お待ちください」
-
idを使わずにonclickで自身の要...
-
無名関数を使うメリットは何で...
-
LaTeX:数式を等号揃えにする方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ActiveXobjectが作成できない
-
<a>タグのテキストを取得
-
onchangeイベントを使ってspan...
-
javascriptで編集可能不可能の...
-
innerHTML実行後のイベント
-
javascriptの質問です
-
クリックでURLに飛ばすときに、...
-
ボタン上でマウスを押している...
-
別フレームのタグ属性を取得す...
-
DIV内のDIV要素を移動する。
-
HTML:Tableタグに対し、JavaScr...
-
任意の座標をクリックさせるには
-
お気に入り用のボタンを配置し...
-
1つの処理で複数表示させたい
-
WordPressのコンタクトフォーム...
-
指定した数値同士を合計計算し...
-
JavaScriptで文字列の置き換え
-
フォーカスを合わせる
-
div要素内の全input要素をdisable
-
[javascript]DOCTYPE宣言対応に...
おすすめ情報