Напротив PreventDefault для ссылок и выпадающего селектора? - PullRequest
3 голосов
/ 18 августа 2011

У меня есть событие нажатия jquery для группы ссылок и одного раскрывающегося селектора в моем представлении MVC, и я предотвращаю их по умолчанию перед выполнением события, потому что большинство из них перенаправляют в представление (перенаправление останавливает мой код jquery.не так ли?)После всех моих обратных вызовов в моем событии click, я бы хотел, чтобы ссылки и выпадающий селектор делали событие по умолчанию, чтобы он не просто сидел на странице, как будто ничего не произошло.

способ получить все ссылки / раскрывающийся список, чтобы вернуться к значениям по умолчанию, а затем программно щелкнуть их в jquery?Я попытался $(this).click() и $(this).submit() и e.click() и e.submit() без удачи.

Вот мой код

 $("input,a,select").not("#SubmitButton").click(function (e) {
        e.preventDefault();
        console.log("prevented default");
        deletePreview($(this));
    });
    function deletePreview(button) {
        console.log("clicked");
        //Delete Offer from DB
        $.post('@Url.Content("~/")Offer/DeleteJoAnnOffer/?offerId=' + offerID, function (data) {
              console.log("finished deleting");
              if (button.attr('id') == "CancelButton") {
                 window.location.href = '@Url.Content("~/")Offer/CreateJoAnn/';
              } else {

                  //DO DEFAULT ACTION HERE

              }
       });
    };

[ПРАВИТЬ]: Еще один вопрос:Если я не использую warnDefault (), мое событие jquery выполняется (ну, в первую очередь, потому что мои журналы консоли «щелкнули»), но я не могу подтвердить, действительно ли выполняются сообщения jquery, потому что консоль обновляется на новой странице.

Ответы [ 2 ]

2 голосов
/ 18 августа 2011

Функция "post" в jquery является асинхронной операцией (флаг асинхронности по умолчанию имеет значение true). Ваш код внутри события click будет полностью выполнен до перезагрузки страницы, поэтому нет необходимости использовать protectDefault. Вы должны изменить функцию публикации в deletePreview, чтобы она была синхронной:

        $("input,a,select").not("#SubmitButton").click(function (e) {
             console.log("you do not need to call prevented default :)");
             deletePreview($(this));
         });
         function deletePreview(button) {
             console.log("clicked");
             //Delete Offer from DB
             $.ajax('@Url.Content("~/")Offer/DeleteJoAnnOffer/?offerId=' + offerID,
             {
                 async: false,
                 success: function (data) {
                     console.log("finished deleting");
                     if (button.attr('id') == "CancelButton") {
                         window.location.href = '@Url.Content("~/")Offer/CreateJoAnn/';
                     } else {

                         //DO DEFAULT ACTION HERE

                     }
                 }
             });
         };

Это означает, что код внутри события click будет ожидать завершения вызова ajax в deletePreview.

См. http://api.jquery.com/jQuery.ajax/ для объяснения асинхронного параметра

0 голосов
/ 18 августа 2011

Я думаю, что в вашем случае вам не нужно вызывать protectDefault, потому что ваш обработчик событий будет выполнен первым.(Может быть, если вы могли бы позвонить, когда вы хотите перейти в другое место.)

...