1

誰かが私を助けてくれるのではないかと思います。

まず、私はこれに非常に慣れていないため、お詫び申し上げます。非常に基本的な質問/エラーのように見えるものがあることをご容赦ください。

以下のコードの抜粋は、現在のユーザーに関連するレコードのテーブルを正常に作成します。

作業ソリューション - Baylor Rae ' は、解決策を見つけるために、過去 3 ~ 4 日間、精力的に私と協力してくれました。すべての Baylor Rae ' は、完全に成功したスクリプトを提供できませんでした。ただし、以下の完全なスクリプトは、jazzman1 @ PHP Freaks の厚意によるものです。

メインスクリプト

 <script type="text/javascript">
        $(document).ready(function(){
            $('form.delete').submit(function(e){
              console.log('submit'); return false;   
            })
        })
    </script>   

<script type="text/javascript">
    $(document).ready(function(){
        $('form.delete').submit(function(e){ 

            e.preventDefault();
            var elem = $(this).closest('.delete');
            var lid = $(this).serialize();
            $.confirm({
                 'title'    : 'Delete Confirmation',
            'message'   : 'You are about to delete this Location. <br />It cannot be restored at a later time! Do you wish to continue?',
                'buttons'   : {
                    'Yes'   : {
                'class' : 'blue',
                'action': function(){
                //elem.slideUp();
                              $.ajax({ 
                            url: 'deletelocation.php', 
                            type: 'POST', 
                            data: lid, 
                            success: function(response) { 
                            console.log('success', response); 
                            }, 
                            error: function() { 
                            console.log('error') 
                            } 
                            }); 
                    }
                },
                'No'    : {
                    'class' : 'gray',
                                        'action': function(){}  // Nothing to do in this case. You can as well omit the action property.

                }
            }
        });

    });

    })
</script>  

jqueryconfim.js

  (function($){

        $.confirm = function(params){

            if($('#confirmOverlay').length){
                // A confirm is already shown on the page:
                return false;
            }

            var buttonHTML = '';
            $.each(params.buttons,function(name,obj){

                // Generating the markup for the buttons:

                buttonHTML += '<a href="#" class="button '+obj['class']+'">'+name+'<span></span></a>';

                if(!obj.action){
                    obj.action = function(){};
                }
            });

            var markup = [
                '<div id="confirmOverlay">',
                '<div id="confirmBox">',
                '<h1>',params.title,'</h1>',
                '<p>',params.message,'</p>',
                '<div id="confirmButtons">',
                buttonHTML,
                '</div></div></div>'
            ].join('');

            $(markup).hide().appendTo('body').fadeIn();

            var buttons = $('#confirmBox .button'),
                i = 0;

            $.each(params.buttons,function(name,obj){
                buttons.eq(i++).click(function(){

                    // Calling the action attribute when a
                    // click occurs, and hiding the confirm.

                    obj.action();
                    $.confirm.hide();
                    return false;
                });
            });
        }

        $.confirm.hide = function(){
            $('#confirmOverlay').fadeOut(function(){
                $(this).remove();
            });
        }

    })(jQuery);

メインスクリプトのフォーム

<form name="delete" id="delete" class="delete">
<input type="hidden" name="lid" id="lid" value="<?php echo $theID ?>" />
<input type="submit" value="Delete Record"/>
</form>

削除場所.php

<?php

    $lid = intval($_POST['lid']);
    $query = mysql_query("DELETE FROM table WHERE locationid='".$lid."'");

    ?>

テーブルの最後に 4 つのボタンがあることがわかります。これらのボタンは、locationsaction.phpスクリプトを通じてユーザーを 4 つの異なる画面にナビゲートし、すべてが値を介してメイン テーブル レコードにリンクされていlidます。このスクリプトを以下に示します。

関数の確認メッセージを実装しようとしていDeleteます。このソースコードはここにあります。

ここで、私は次に何をすべきかについて少し確信が持てなくなりました。on clickボタンイベントを関数の名前にリンクしようとしましたDeleteが、確認メッセージではなく、ユーザーが空白の画面に移動し、レコードが削除されます。

JavaScript コンソールを実行しましたが、エラーは発生していません。続行する方法が少しわかりません。

誰かがこれを見て、どこが間違っているのか教えてください。

多くの感謝と親切な敬意

4

6 に答える 6

1

実際、フォームにid btn-deleteのボタンが見つかりません。フォームに削除ボタンが存在する場合は、これを変更してください。

<input type="submit" value="Delete Record" />

<input type="button" id="btn-delete" value="Delete Record" />

または、他の入力を使用して、そのタイプが送信されていないことを確認します。

<input type="submit" value="Your button" />

する必要があります

<input type="button" value="Your button" />
于 2012-07-20T06:22:01.533 に答える
1

問題はJavaScriptとは何の関係もありません

基本的な問題は、フォームのアクションがレコードを削除することであるようです(JavaScriptでコーディングした内容に関係なく)。フォームのアクションを「。」に変更します。およびonsubmit="return false"(フォームがそれ自体で何かを実行するのを停止します)。これで、$。confirmを適切なボタンにアタッチすると機能するはずです。

これから一歩後退します-フォーム(または送信ボタン)はまったく必要ありません。そうすれば、フォームのデフォルトの動作と戦う必要はありません。

于 2012-07-20T22:48:03.140 に答える
1

確認のためにjquery uiダイアログを使用できます:

   <script type="text/javascript">
    $('#btn-delete').click(function (e) {
        e.preventDefault();
        var elem = $(this).closest('.item'), formSerialize = $(this).parent().serialize(), objParent = $(this).parent();
        $('<div></div>').appendTo('body')
                    .html('<div><h6>Delete?</h6></div>')
                    .dialog({
                        modal: true, title: 'Delete Confirmation', zIndex: 10000, autoOpen: true,
                        width: 'auto', resizable: false,
                        buttons: {
                            Yes: function () {
                                $.ajax({
                                    url: 'deletelocation.php',
                                    type: 'post',
                                    data: formSerialize//,
                                    //success: function (data) {
                                    //    objParent.slideUp('slow').remove();
                                    //}
                                });


                                //Or
                                objParent.slideUp('slow').remove();


                                $(this).dialog("close");
                            },
                            No: function () {
                                $(this).dialog("close");
                            }
                        },
                        close: function (event, ui) {
                            $(this).remove();
                        }
                    });

    });
</script>
于 2012-07-20T07:11:52.020 に答える
1

リダイレクトを防ぐ

フォームがまだ送信中であるため、リダイレクトが発生しているようです。クリック イベントの先頭に次の行を追加して、フォームが送信されないようにする必要があります。

$('#btn-delete').click(function(e) {
    e.preventDefault();
    var elem = $(this).closest('.item');
    

を呼び出すe.preventDefault()、ブラウザーの既定のアクション(この場合はフォームの送信) が実行されなくなります。

ボタンの処理方法の変更

locationsaction.phpボタンの値に基づいてページへのリダイレクトを伝えることができる限り。

これを行うより良い方法は、各ページへのリンクを作成しlid、パラメーターとして渡すことです。これは、次のページに何らかのコンテキストを提供しながら、ページをリンクする標準的な方法です。

注:$_GET['lid']の代わりに使用するには、各ページを変更する必要があります$_SESSION['lid']

注 2:ページの途中で PHP タグを「閉じる」および「開く」ことは完全に有効です。以下に示すコードでは、HTML を記述できるように PHP を閉じ、完了したら PHP を再度開きました。

<?php // this line is for syntax highlighting
/* display row for each user */
$theID = $row['locationid'];
?>
  <tr>
    <td style="text-align: center"><?php echo $row['locationname'] ?></td>
    <td><a href="addimages.php?lid=<?php echo $theID ?>">Images</a></td>
    <td><a href="addfinds.php?lid=<?php echo $theID ?>">Add Finds</a></td>
    <td><a href="locationfinds.php?lid<?php echo $theID ?>">View Finds</a></td>
    <td>
      <form method="post" action="deletelocation.php" class="delete-record">
        <input type="hidden" name="lid" value="<?php echo $theID ?>" />
        <input type="submit" value="Delete Record" />
      </form>
    </td>
  </tr>
<?php

deletelocation.phpリンクを使用しなかったのは、ファイルにリンクしたときだけでした。これは、データベースを変更するときに GET 要求を使用してはならないためです

POST リクエストを使用すると、クロスサイト リクエスト フォージェリを簡単に防ぐことができます。

テーブルの列名を変更する

locationidと の列名に、locationname分離のタイプがないことに気付きました。location_idこれらの名前をおよびに変更することをお勧めしlocation_nameます。

これはファイル名にも当てはまります。ファイル名の単語を区切るためにアンダースコアまたはダッシュを含めることができます。アンダースコアの方が読みやすいと思うので、通常はアンダースコアを使用しますが、それはあなたの選択です。

削除ページに直接投稿

deletelocation.phpAJAX を使用しているため、 URL を直接指定できます。上記で提案した変更により、保持する理由はありませんlocationsaction.php

$.ajax({
    url: 'deletelocation.php',
    type: 'post',
    data: $(this).parent().serialize(),
    success: function () {
        img.parent().fadeOut('slow');
    }
});

また、データの受け渡し方法も変更しました。.serialize()は、ロケーション ID を自動的に取得し、 のinput[name=lid]ようなクエリ文字列を作成しますlid=1


編集#1

可能であれば、locationsaction スクリプトを保持したいと思います。私のページの多くは、SESSION ID に依存しており、多くのコードを書き直さない限り、Get を使用することはできません。

あなたが使用している方法locationsaction.phpとセッションは、私が行う方法ではありません。しかし、それはアプリケーションの構造であり、好きなように構築できます。

ボタンの種類を送信ではなくボタンに変更し、id を同じにして、JS コードがこれを取得できるようにすることはできますか?

タイプをボタンに変更することはできますが、JavaScript が無効になっている場合、フォームは送信されません。一般に、JS なしで動作するようにページを作成してから、JS を作成してブラウザのデフォルトの動作を変更します。

また、あなたの AJAX が私のコードのトップ セクションを置き換えているだけなのか確認していただけますか?

いいえ、設定方法を変更しただけですlid。コードのブロック全体を貼り付けたくありませんでした。

于 2012-07-17T22:31:12.037 に答える
1

観察 1:

function delete(){
$(document).ready(function(){

それは本当にあなたのコードの行の順序ですか? jQuery Ready フックは関数定義の内側にありますか? または、間違ってここに間違った順序で投稿しましたか?

前者の場合は、何よりも先にこれを修正してください。それ以外の場合は、次をお読みください。

  1. なぜ $('.item.delete') なのですか? class .item のマークアップが表示されませんか? それはどこにある?そもそも、このセレクターがいくつかの要素と一致することは確かですか? また、クラス delete を持つ要素を検索するため、.delete ではなく、id 属性を介して要素を参照するために #delete を使用する必要があります。

  2. id:delete ボタンとその他のボタンは送信タイプのボタンです。つまり、それらのクリック ハンドラーは送信フローをブロックしません。すべてのボタン タイプを送信ではなく、ボタンに変更できます。以下のコード例。

  3. 削除ボタンの宣言的な onClick はなぜですか? それを取り除く。

(また、この場合、フォームをデシリアライズする必要がない限り、実際にはフォームは必要ありません。これは、マークアップが与えられた要件や意図のようには見えません)。

<td><input type='button' name='type' id='details' value='Details'/></td>
<td><input type='button' name='type' id='images' value='Images'/></td>
<td><input type='button' name='type' id='addFinds' value='Add Finds'/></td>
<td><input type='button' name='type' id='viewFinds' value='View Finds'/></td>
<td><input type='button' name='type' id='delete' value='Delete' /></td>

そしてあなたのJS:

//please, be careful with the selector.
//it could be that it is not matched at all,
//hence jQuery will not bind to anything
//and nothing will ever fire!
//note the #delete for Id! .delete is for a class!!!!!!
$('.item #delete').click(function () {

    var elem = $(this).closest('.item');

    $.confirm({
        'title': 'Delete Confirmation',
        'message': 'Delete?',
        'buttons': {
            'Yes': {
                'class': 'blue',
                'action': function () {
                    //elem.slideUp();
                    $.ajax({
                        url: 'locationsaction.php',
                        type: 'post',
                        data: {
                            lid: "VALUE",
                            type: 'Delete' //you need to add the type here!
                        },
                        success: function () {
                            img.parent().fadeOut('slow');
                        }
                    });

                }
            },
            'No': {
                'class': 'gray',
                'action': function () {} // Nothing to do in this case. You can as well omit the action property.
            }
        }
    });

また、フォームの onsubmit イベントに誤ったリターンを余分に追加することもできます

于 2012-07-15T15:56:19.833 に答える
0

e.stopPropagation();を使用してみてください。

$('#btn-delete').click(function(e) {
    e.preventDefault();
    e.stopPropagation();
于 2012-07-19T18:50:47.433 に答える