0

皆さん、こんばんわ、

私は現在、インラインJSをクリーンアップして、それを独自の.jsファイルに分割し、コードの一部を関数に分割しようとしています。div以下にコードを示します。名前が空のHTMLファイルがあります#main。ドキュメントの準備ができたら、firstLoad関数を呼び出します。単純にSeemsを呼び出すだけです$("#main").load("login.php"); が、次のステップは、フォームの送信時に、送信されたデータをシリアル化し、文字列に切り替えて、投稿で送信することです。index.phpこれは、フォームをファイルにハードコーディングした場合は何らかの理由で機能しますが、.loadを使用して.loadを入力した場合は機能しません#main。これがなぜなのか理解できません。誰かがそれを少し説明できれば、それは素晴らしいことだと思います。私のコードは次のとおりです。

更新さらに検索した後、私は次のようなこのスレッド に出くわしました:

結局のところ、jquery .load()関数は問題なく機能しており、私はこれに間違って取り組んでいます。

.load()関数が正常に完了すると、「引数」の1つとしてコールバックを受け入れる他のjquery関数と同様に、プログラマーに含まれる「コールバック」関数を呼び出します。.load()関数は、 エラーが発生するか、HTMLの置換と新しいコンテンツの読み込みを正常に開始すると完了しますが、それはITです。その場合、コンテンツの読み込みにはどれだけ時間がかかりますが、.load呼び出しはその前にすでに完了しています。したがって、.loadコンテンツがロードされた後にコールバックが実行されることを期待しても、失望するだけです。;)

私と同じように、私がそう思ったと思った人も含めて、他の人がこれから学ぶことができることを願っています。証明:jquery ajax .loadページに記載されているように、コールバックは、ロードが完了したときではなく、リクエストが完了したときに実行されます。ユーレカ。おっと。

フォローアップの質問につながるのは、ロードコンテンツがDOMに追加された後、どのようにフォームを操作できますか?これは確かに簡単な修正ですが、私はAJAXを初めて使用し、正しい方向に微調整することができます。login.phpスクリプト内にドキュメント(ready)を追加すると、htmlで追加されるので正しく機能することに気付きましたが、インラインJSを避けようとしているため、これは最もクリーンな方法ではないようです。これ以上のアドバイスはありますか?

/アップデート

PHP / HTML

index.php

<?php
    session_start();
    $sessionNumber = session_id();
?>
<!doctype html>
<!-- Conditional comment for mobile ie7 blogs.msdn.com/b/iemobile/ -->
<!--[if IEMobile 7 ]>    <html class="no-js iem7" lang="en"> <![endif]-->
<!--[if (gt IEMobile 7)|!(IEMobile)]><!--> <html class="no-js" lang="en"> <!--<![endif]-->

<head>
  <meta charset="utf-8">

  <title>MyMobile</title>
  <meta name="description" content="">

  <meta name="HandheldFriendly" content="True">
  <meta name="MobileOptimized" content="320">
  <meta name="viewport" content="width=device-width">

  <link rel="apple-touch-icon-precomposed" sizes="114x114" href="img/h/apple-touch-icon.png">
  <link rel="apple-touch-icon-precomposed" sizes="72x72" href="img/m/apple-touch-icon.png">
  <link rel="apple-touch-icon-precomposed" href="img/l/apple-touch-icon-precomposed.png">
  <link rel="shortcut icon" href="img/l/apple-touch-icon.png">

  <meta http-equiv="cleartype" content="on">

  <link rel="stylesheet" href="css/style.css">

  <script src="js/libs/modernizr-2.0.6.min.js"></script>
</head>

<body>

  <div id="container">
    <header id="header">
        <img alt="Logo" src="img/logo.png" />
        <div id="blackHead">Please sign-in to continue</div>
    </header>
    <div id="main" role="main">

    </div>

    <footer id="footer">
        <div id="greyFoot">
            &copy; 2012 ACME<br />
            <pre id="result"></pre>
        </div>
    </footer>
  </div> <!--! end of #container -->


  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
  <script>window.jQuery || document.write('<script src="js/libs/jquery-1.7.1.min.js"><\/script>')</script>
  <script type="text/javascript" src="js/firstLoad.js"></script>

</body>
</html>

login.php

<?php session_start();
    $sessionNumber = session_id();
?>


<!-- begin login form -->
<?php if(isset($_SESSION['sessionemail'])){ ?>
    <a href="logout.php" id="logout">Logout</a>
<?php }else { ?>

<form id="logForm" name="login" method="post" action="#">
    <label for="sessionemail">Email</label><br />
    <input id="sessionemail" type="email" name="sessionemail" autofocus="autofocus" autocapitalize="off" maxlength="150" required="true" value="" class="inputText" /><br />
    <label for="password">Password</label>
    <input id="password" type="password" name="password" required="true" value="" class="inputText" /><br />
    <br />
    <input type="hidden" name="sessionid" id="sessionid" value="<?php echo $sessionNumber; ?>" />
    <input type="hidden" name="subtocall" id="subtocall" value="g2.web.login.sub" />
    <input type="submit" value="Sign-In" name="submit" class="submitBox" />

</form><!-- end login form -->
<?php } ?>

そして最後に、私のJS / Jquery

firstLoad.js

//function serializes our object

(function($){
    $.fn.serializeObject = function()
    {
        var o = {};
        var a = this.serializeArray();
        $.each(a, function() {
            if (o[this.name] !== undefined) {
                if (!o[this.name].push) {
                    o[this.name] = [o[this.name]];
                }
                o[this.name].push(this.value || '');
            } else {
                o[this.name] = this.value || '';
            }
        });
        return o;
    };
})(jQuery);


//firstLoad function runs on document ready
//it loads the login form into the main div and slides
//the container down
(function($){

    $.fn.firstLoad = function(){
        return this.each(function() {
            $("#container").slideUp("slow", function(){
                $("#main").load('./login.php', function(){
                    $("#container").slideDown("slow", function(){
                    });
                });
            });
        });
    };
})(jQuery);

//logParse takes the loginResponse from the server
//changes from string to object, runs a check for authentication then
//manipulates the object dropping excess keys and adding new relevant ones for
//the intial to do list call
(function($){
    $.fn.logParse = function(xml){
        return this.each(function() {
            //parse the JSON login check string from the XML response
            var loginResponse = $(xml).find('string').text();
            //setup isBad variable for error check
            var isBad = false;
            //convert to JSON object from parsed string data
            loginResponse = $.parseJSON(loginResponse);
            //check if the sessionID is correct and user authenticated properly
            if((loginResponse.SESSIONID != "<?php echo $sessionNumber; ?>") || (loginResponse.ISAUTHENTICATED == 0)){isBad = true;}
            //if error flag is raised alert and bounce back to login
            if(isBad){
                alert("Unauthorized connection, please try again.");
            }
            //if there are no errors
            else{
                alert("so far so good!");
                //set up a new JSON object for to do list passback
                //and import the values from the lognResponse object
                //var todoPost =
            }
        });
    };
})(jQuery);

$(document).ready(function(){
    //hide screen for slidedown
     //$("#container").addClass("noShow");
    //allow cross domain scripts
    $.support.cors = true;
    //call firstLoad function to slide in the login prompt
    $("#main").firstLoad(function(){


        //create JSON object to store form input for AJAX POST
        //create submit listener
        $("#logForm").submit(function(){

            alert("inside submit");
            //parse form into formObj for data passing and manipulation
            var formObj = JSON.stringify($("form").serializeObject());
            //output initial formObj into result pane
            $("#result").text(formObj);
            $("#main").text("submitted: " + formObj);

            //AJAX POST call
            $.ajax({
                //type of communication
                type: "POST",
                //action for form
                url: "http://mydomain.com/JSONService.asmx/G2WebRequest",
                //data to be passed
                data: "request="+ formObj,
                //type of data passed in
                contentType: "application/x-www-form-urlencoded; charset=utf-8",
                //enable cross domain
                crossDomain: "true",
                //data type returned from webservice
                dataType: "xml",

                //if login POST was successful
                success: function(xml){
                    alert("post successful");
                    $.logParse(xml);

                },
                //if login POST failed
                error: function(XMLHttpRequest, textStatus, errorThrown){
                    alert(errorThrown);
                }




            });
        });
    });
});
4

2 に答える 2

0

JQuery.on()この問題を解決しました。それを理解するのに少し時間がかかりました。

于 2012-08-12T15:15:04.900 に答える
0

$("#logForm")ログインフォームがDOMに完全にロードされる前に、リスナーをオンに設定している可能性があります。これは、ハードコーディングされたときにログインフォームが機能する理由を説明します。これは次の方法でテストできますalert($("#logForm").length);-見つからない場合はゼロになります。

この場合、リスナーを接続する前に、ログインページが完全に読み込まれるまで待つ必要があります。完了したらfirstLoad、おそらく関数を呼び出すでしょう。load

幸運を。

于 2012-08-02T04:42:47.000 に答える