最近几天,我一直在尝试正确安装jQuery.AreYouSure?结果不一致的插件。
我决定根据来自此帖子的信息Warn user before leaving web page with unsaved changes使用此插件。我还阅读了GitHub上的插件文档:jQueryAreYouSure

这是我所做的:

  • 我刷新页面。
  • 我一直在将代码从custom.js文件复制到chrome控制台中。
  • 我将表单
  • 更改为
  • 我要么单击“刷新”按钮,要么单击另一个站点链接以导航到不保存的位置。

  • 我的结果是:有时我会收到警报消息,但有时却没有,我没有收到。当收到警报时,我也无法复制或理解。有时,当我第一次单击离开页面时,它可能会出现;而有时,当我单击几次后,它可能会出现。

    javascripts / application.js:
    // This is a manifest file that'll be compiled into application.js, which will include all the files
    // listed below.
    //
    // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
    // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
    //
    // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
    // compiled file.
    //
    // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
    // about supported directives.
    //
    //= require jquery
    //= require jquery_ujs
    //= require bootstrap-sprockets
    //= require turbolinks
    //= require areyousure/areyousure
    //= require_tree .
    

    javascripts / areyousure / areyousure.js:
    /*!
     * jQuery Plugin: Are-You-Sure (Dirty Form Detection)
     * https://github.com/codedance/jquery.AreYouSure/
     *
     * Copyright (c) 2012-2014, Chris Dance and PaperCut Software http://www.papercut.com/
     * Dual licensed under the MIT or GPL Version 2 licenses.
     * http://jquery.org/license
     *
     * Author:  [email protected]
     * Version: 1.9.0
     * Date:    13th August 2014
     */
    (function($) {
    
      $.fn.areYouSure = function(options) {
    
        var settings = $.extend(
          {
            'message' : 'You have unsaved changes!',
            'dirtyClass' : 'dirty',
            'change' : null,
            'silent' : false,
            'addRemoveFieldsMarksDirty' : false,
            'fieldEvents' : 'change keyup propertychange input',
            'fieldSelector': ":input:not(input[type=submit]):not(input[type=button])"
          }, options);
    
        var getValue = function($field) {
          if ($field.hasClass('ays-ignore')
              || $field.hasClass('aysIgnore')
              || $field.attr('data-ays-ignore')
              || $field.attr('name') === undefined) {
            return null;
          }
    
          if ($field.is(':disabled')) {
            return 'ays-disabled';
          }
    
          var val;
          var type = $field.attr('type');
          if ($field.is('select')) {
            type = 'select';
          }
    
          switch (type) {
            case 'checkbox':
            case 'radio':
              val = $field.is(':checked');
              break;
            case 'select':
              val = '';
              $field.find('option').each(function(o) {
                var $option = $(this);
                if ($option.is(':selected')) {
                  val += $option.val();
                }
              });
              break;
            default:
              val = $field.val();
          }
    
          return val;
        };
    
        var storeOrigValue = function($field) {
          $field.data('ays-orig', getValue($field));
        };
    
        var checkForm = function(evt) {
    
          var isFieldDirty = function($field) {
            var origValue = $field.data('ays-orig');
            if (undefined === origValue) {
              return false;
            }
            return (getValue($field) != origValue);
          };
    
          var $form = ($(this).is('form'))
                        ? $(this)
                        : $(this).parents('form');
    
          // Test on the target first as it's the most likely to be dirty
          if (isFieldDirty($(evt.target))) {
            setDirtyStatus($form, true);
            return;
          }
    
          $fields = $form.find(settings.fieldSelector);
    
          if (settings.addRemoveFieldsMarksDirty) {
            // Check if field count has changed
            var origCount = $form.data("ays-orig-field-count");
            if (origCount != $fields.length) {
              setDirtyStatus($form, true);
              return;
            }
          }
    
          // Brute force - check each field
          var isDirty = false;
          $fields.each(function() {
            $field = $(this);
            if (isFieldDirty($field)) {
              isDirty = true;
              return false; // break
            }
          });
    
          setDirtyStatus($form, isDirty);
        };
    
        var initForm = function($form) {
          var fields = $form.find(settings.fieldSelector);
          $(fields).each(function() { storeOrigValue($(this)); });
          $(fields).unbind(settings.fieldEvents, checkForm);
          $(fields).bind(settings.fieldEvents, checkForm);
          $form.data("ays-orig-field-count", $(fields).length);
          setDirtyStatus($form, false);
        };
    
        var setDirtyStatus = function($form, isDirty) {
          var changed = isDirty != $form.hasClass(settings.dirtyClass);
          $form.toggleClass(settings.dirtyClass, isDirty);
    
          // Fire change event if required
          if (changed) {
            if (settings.change) settings.change.call($form, $form);
    
            if (isDirty) $form.trigger('dirty.areYouSure', [$form]);
            if (!isDirty) $form.trigger('clean.areYouSure', [$form]);
            $form.trigger('change.areYouSure', [$form]);
          }
        };
    
        var rescan = function() {
          var $form = $(this);
          var fields = $form.find(settings.fieldSelector);
          $(fields).each(function() {
            var $field = $(this);
            if (!$field.data('ays-orig')) {
              storeOrigValue($field);
              $field.bind(settings.fieldEvents, checkForm);
            }
          });
          // Check for changes while we're here
          $form.trigger('checkform.areYouSure');
        };
    
        var reinitialize = function() {
          initForm($(this));
        }
    
        if (!settings.silent && !window.aysUnloadSet) {
          window.aysUnloadSet = true;
          $(window).bind('beforeunload', function() {
            $dirtyForms = $("form").filter('.' + settings.dirtyClass);
            if ($dirtyForms.length == 0) {
              return;
            }
            // Prevent multiple prompts - seen on Chrome and IE
            if (navigator.userAgent.toLowerCase().match(/msie|chrome/)) {
              if (window.aysHasPrompted) {
                return;
              }
              window.aysHasPrompted = true;
              window.setTimeout(function() {window.aysHasPrompted = false;}, 900);
            }
            return settings.message;
          });
        }
    
        return this.each(function(elem) {
          if (!$(this).is('form')) {
            return;
          }
          var $form = $(this);
    
          $form.submit(function() {
            $form.removeClass(settings.dirtyClass);
          });
          $form.bind('reset', function() { setDirtyStatus($form, false); });
          // Add a custom events
          $form.bind('rescan.areYouSure', rescan);
          $form.bind('reinitialize.areYouSure', reinitialize);
          $form.bind('checkform.areYouSure', checkForm);
          initForm($form);
        });
      };
    })(jQuery);
    

    我创建了javascripts / custom.js:
    $('form').areYouSure( {'message':'You have unsaved changes on this page. Do you want to leave this page and discard your changes or stay on this page?'} );
    

    最佳答案

    通过删除删除了turbolinks//= require turbolinks文件中的application.js

    (目前为2018年1月)

    如果turbolinks处于 Activity 状态,则仅在刷新页面时jquery.AreYouSure才起作用。

    关于javascript - jQuery.AreYouSure插件不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34443682/

    10-09 15:00