-1


0

JavaScriptの再帰が正しく機能しません

次の再帰関数がなぜ機能しないのか、誰でも言うことができますか? 特定の要素のすべてのラジオボタンを再帰的に収集する必要があります。 しかし、なんらかの理由で見つかりません!?

ありがとうございます。

        function AllInputs(radioElement) {
            this.radioInputs = ((arguments.length == 1) ? [radioElement] : []);
        }

        AllInputs.prototype.toString = function() {
            return "[object AllInputs: radioInputs: " + this.radioInputs.length + "]";
        }

        AllInputs.prototype.add = function(otherAllInputs) {
            this.radioInputs = this.radioInputs.concat(otherAllInputs.radioInputs);
        }

        function getAllInputsOfElement(element) {
            if (element.tagName.toLowerCase() == "input") {
                if (element.getAttribute("type").toLowerCase() == "radio") {
                    return new AllInputs(element);
                } else {
                    return new AllInputs();
                }
            } else {
                var result = new AllInputs();

                for (i = 0; i < element.children.length; i++) {
                    result.add(getAllInputsOfElement(element.children[i]));
                }

                return result;
            }
        }

        function main() {
            alert(getAllInputsOfElement(document.getElementById("MyTable")));
        }





        Day

月曜、火曜、水曜

2 Answer


1


DOMメソッドで簡単に処理できる問題に対する非常に複雑なソリューションがあります。 代わりにこれを試してください:

        function main() {
            var inputs = document.getElementById("MyTable").getElementsByTagName("input");
            var radios = [];

            for(var i=0; i<inputs.length; i++) {
                if (inputs[i].type == "radio") {
                    radios.push(inputs[i]);
                }
            }
            alert("Found " + radios.length + " radio buttons");
        }





        Day

月曜、火曜、水曜

jQueryを使用するとさらに簡素化できます。


1


これを試して

        function AllInputs(radioElement) {
            this.radioInputs = ((arguments.length == 1) ? [radioElement] : []);
        }

        AllInputs.prototype.toString = function() {
            return "[object AllInputs: radioInputs: " + this.radioInputs.length + "]";
        }

        AllInputs.prototype.add = function(otherAllInputs) {
            this.radioInputs = this.radioInputs.concat(otherAllInputs.radioInputs);
        }

        function getAllInputsOfElement(element) {
            if (element.tagName.toLowerCase() == "input") {
                if (element.getAttribute("type").toLowerCase() == "radio") {
                    return new AllInputs(element);
                } else {
                    return new AllInputs();
                }
            } else {
                var result = new AllInputs();
                var noOfChildren = element.children.length;
                for (var i = 0; i < noOfChildren; i++) {
                    result.add(getAllInputsOfElement(element.children[i]));
                }

                return result;
            }
        }

        function main() {
            alert(getAllInputsOfElement(document.getElementById("MyTable")));
        }





        Day

月曜、火曜、水曜

私はあなたが解決しようとしているものをチェックしていません。 あなたが抱えている問題を確認しました。

これは、getAllInputsOfElement()の反復変数iのスコープのためです。

メソッドに対してローカルとして宣言されていない変数iは、グローバルスコープで使用できます。 したがって、varキーワードを使用して変数をローカルとして宣言するだけです。

この種の問題を修正するには、Javascriptの実行を確認するために、他のデバッグツールにhttp://www.getfirebug.com/[firefug]を使用してみてください。

実際の実行パスを見つけて分析し、コード実行の問題を見つけるために、いくつかのログメッセージを入れてみてください

これがあなたの問題を解決することを願っています