2

作業中のサイトで require を使用しています。チェックアウトの作業中に、遭遇して発行しました。クレジットカードの画像を変更して、有効化されたカード番号が入力された番号であることを示すようにしようとしています。

ただし、キーを押すたびに、次のエラーが発生します。

Uncaught TypeError: object is not a function 

そして、それは私の「コントローラー」の12行目から来ていると言います。

var chkCard = new CreditImage($(this).val(), '.icon-credit-cards');

キャッチされていない TypeError: オブジェクトは関数ではありません (3 回繰り返されます)

これが私の「プレゼンター」別名assets/scripts/presenters/CreditImage.jsです

require(
    [
        'jquery'
    ],
    function ($) {
        "use strict";

        var CreditImage = function ($number, $el) {
            // Match and define
            var visa = $number.match(/^4[0-9]{12}(?:[0-9]{3})?$/);
            var mastercard = $number.match(/^5[1-5][0-9]{14}$/);
            var amex = $number.match(/^3[47][0-9]{13}$/);
            var discover = $number.match(/^6(?:011|5[0-9]{2})[0-9]{12}$/);
            var matched;

            // Create matched var
            if (visa) {
                matched = "visa";
            } else if (mastercard) {
                matched = "mastercard";
            } else if (amex) {
                matched = "amex";
            } else if (discover) {
                matched = "discover";
            }

            if (matched) {
                // Highlight the matched credit card
                $("."+$el+":not("+$el+"-" + matched + ")").addClass($el);
                $("."+$el).addClass($el+"-" + matched);
            } else {
                // No match, highlight them all
                $(".+$el).removeClass().addClass($el);
            }

            return matched;
        }
    }
);

そして、ここに「コントローラー」があります:

require(
    [
        'jquery',
        'assets/scripts/presenters/CreditImage'
    ],
    function ($, CreditImage) {
        'use strict';
        $(function () {         
            // Credit card validation
            $("#add-cc-card-number").bind("keyup", function () {

                var chkCard = new CreditImage($(this).val(), 'icon-credit-cards'));

            });

        });
    }
);
4

2 に答える 2

1

2 つの問題が見られます。いずれか 1 つだけでも、コードが機能しなくなるのに十分です。

スコーピングの問題#1

CreditImage()内部で宣言されている無名関数に対してプライベートです。さて、正直なところ、私は requirejs についてあまり知りませんが、そのようなローカル スコープの関数が親関数の外部からアクセスできる方法はありません。

requirejs コードの例を調べて、他の人がどのように関数を個別の requirejs 呼び出し間で呼び出せるように設計したかを確認する必要があります (または、何らかの方法で 1 つの呼び出しのみを使用している可能性があります)。または、優れたチュートリアルやブログ投稿を見つけることもできます。

いずれにせよ、今のやり方ではうまくいきません。

スコーピングの問題#2

2 番目のコード ブロックにはCreditImageパラメーターがあります。つまり、関数内では、この名前への参照は常にパラメーターを参照し、外部スコープの関数または変数を参照することはできません。CreditImage繰り返しますが、requirejs には詳しくありませんが、requirejs が関数をCreditImageパラメーターに渡していることは確かですか?

Chrome を使用するか、Firebug がインストールされた Firefox を使用console.log(CreditImage);して、下の関数に追加して、何が渡されているかを確認します。少なくとも Windows では、F12 でデバッグ ツールが表示されます。そこから、コンソールを見つけてコードを実行します。

于 2013-01-09T20:13:42.327 に答える
0

挿入 document.domain ="yourDomain"; を試してください。ページのパラメータとして

于 2013-01-21T15:37:30.873 に答える