0

私はSelect2 3.3.1を使用しています。イベントでは、Web サイトで使用するタグを作成および削除する場所として機能する、複数のテキスト入力で変更された要素にアクセスできます。イベント ハンドラーで返されたオブジェクトの反復処理に問題があります。具体的には、個々のタグにアクセスしたいのでこれを行います。イベント ハンドラーの戻りパラメーターには、タグが追加されたか削除されたかによって編成されたこれらのオブジェクトが含まれます。というわけで、これは絶品です。しかし、私が試したことはすべて失敗します。

.on("change", function(e) { 
    alert(JSON.stringify({val:e.val, added:e.added, removed:e.removed}));
    var added = JSON.stringify({added:e.added});
    $.each(added, function(){
        $.ajax({
            url: '/db-interaction/tags.php',
            data: {
                'action': 'addtag',
                'q': this
            },
            type: 'get',
            success: function(output) {

            }
        });             
    });

上記の 2 行目のコマンド

alert(JSON.stringify({val:e.val, added:e.added, removed:e.removed}));

この文字列を表示します

{"val":["newtag"],"added":{"id":"newtag","count":"0"}}アラートで。

この場合、「newtag」という単語をタグとして追加したところです。この内部リストでこれらのアイテムを反復できるようにしたいと思います。

以下に示すように、二重にネストされたループも試しましたが、同じエラーが発生します。JSON 文字列に必要な構造がわかりません。

$.each(added, function(){
      $.each(this, function(){

ajax リクエストは実行されていないようですが、バグが見つかりません。success 関数が実行されず、firebug コンソールにエラーが表示されます。TypeError: invalid 'in' operand ejquery スクリプトを指して、 と表示されます。それは私のバグです、私は確信しています。おそらく、イベント ハンドラー パラメーター 'e' の処理方法に関係しているのですが、何が間違っているのかわかりません。

これがタグスクリプトです。FWIW、 addNewTag() メソッドは他のユースケースで機能します。

<?php

session_start();

include_once "../inc/constants.inc.php";
include_once "../inc/class.tags.inc.php";
$tags = new Tags();

if (isset($_SESSION['LoggedIn']) && $_SESSION['LoggedIn']==1)
{
    if(!empty($_POST['action']) )
    {
        switch($_POST['action'])
        {
            case 'addtag':
                echo $tags->addNewTag();
                break;
            case 'removetag':
                echo $tags->removeTag();
                break;
            case 'getalltags':
                echo $tags->getAllTags();
            default:
                break;
        }
    }
    else if(!empty($_GET['action']))
    {
        switch($_GET['action'])
        {
            case 'addtag':
                echo $tags->addNewTag();
                break;
            case 'removetag':
                echo $tags->removeTag();
                break;
            case 'getalltags':
                echo $tags->getAllTags();
            default:
                break;
        }
    }
}
else
{
    header("Location: /");
    exit;
}

?>

そして addNewTag() メソッドは、他の場合にうまく機能します:

/**
 * Adds a new tag, increment uses_count if it already exists
 * 
 * 
 */
public function addNewTag($name=NULL)
{
    if ($name === NULL){
        if (isset($_POST['q']) )
            $u = $_POST['q'];
        else if (isset($_GET['q']))
            $u = $_GET['q'];
    }
    else{
        $u = $name;
    }

    $sql = "INSERT INTO tags(name,uses_count) VALUES (:term,1) 
            ON DUPLICATE KEY UPDATE uses_count=uses_count+1;";
    if($stmt = $this->_db->prepare($sql)) 
    {
        $stmt->bindParam(":term", $u, PDO::PARAM_STR);
        $stmt->execute();
        $stmt->closeCursor();
    }

誰でも私を助けることができますか?それが役に立つなら、私が試した他のことと、それらがうまくいかなかった理由を説明できます.

4

1 に答える 1

1

次のようなものを試してください

$.each(e.added, function(key, value){
    alert(key + ' - ' + value )
    $.ajax({
        url: '/db-interaction/tags.php',
        data: {
            'action': 'addtag',
            'q': this
        },
        type: 'get',
        success: function(output) {

        }
    });             
});

デモ:フィドル

于 2013-03-15T03:40:16.617 に答える