【问题标题】:Help turning jQuery script into a plugin帮助将 jQuery 脚本变成插件
【发布时间】:2010-01-28 20:18:39
【问题描述】:

轻松搞定

由于我最近一直在学习 jQuery,所以我决定编写自己的模态窗口来播放视频,当点击视频缩略图时。一切正常,但我只是想知道如何将它变成一个插件,这样我就可以在具有不同参数等的不同页面上使用它。我阅读了文档和一些教程,但我似乎无法让它工作。我的基本代码如下:

<script type="text/javascript">
var $j = jQuery.noConflict();
$j(document).ready(function(){

    // Add our click OPEN event
    $j("a.video_link").click(function (e) {
        e.preventDefault();
        // Add our overlay div
        $j('body').append('<div id="overlay" />');
        // Fade in overlay
        $j('#overlay').css({"display":"block","opacity":"0"}).animate({"opacity":"0.2"}, 300),
        // Animate our modal window into view
        $j('#video').css({"top":"43%"}).css({"opacity":"0"}).show().animate({"top": "50%", "opacity": "1"}, 550),
        // Add our close image
        $j('#video').append('<div id="modal-vid-close" title="Close window" />');
        // Add our click CLOSE event
        $j('#overlay, #modal-vid-close').click(function () {
            //Animate our modal window out of view
            $j('#video').animate({"top": "55%", "opacity": "0"}, 350).fadeOut(200),
            // Fade out and remove our overlay
            $j('#overlay').fadeOut(200, function () { $j(this).remove(); $j('#modal-vid-close').remove()} )
        });
    });
});

我想把它变成一个插件,这样我就可以在不同的页面上使用它,只需指定“触发”链接,以及要在窗口中显示的 div id(它已经加载到页面上,但隐藏)。像这样的东西,添加到每个页面的文档加载中:

var trigger = $j('.video_container a');
var modalcontent = $j('#video');

任何帮助,或指向好的教程,非常感谢!

【问题讨论】:

    标签: jquery jquery-plugins


    【解决方案1】:

    这是一个很好的模板,我在教程网站上找到的,Queness

    (function($){
        $.fn.extend({
            // change 'pluginname' to your plugin name (duh)
            pluginname: function(options) {
    
                // options for the plugin
                var defaults = {
                    width: 500,
                    height: 300
                }
    
                var options =  $.extend(defaults, options);
    
                return this.each(function() {
                    // main code goes here, will apply to each element of $(this)
                    // e.g. `$(this).click( function() {} )`
                    // also have access to `options` i.e. `options.width`
                });
            }
        });
    })(jQuery);
    

    然后把它放到你的 HTML 中:

    <script type="text/javascript">
    $(document).ready( function() {
        // use default options
        $('.selector').pluginname();
        // custom options
        $('.selector').pluginname({width:300, height:200});
    });
    </script>
    

    【讨论】:

    • 我刚刚问了一个问题,即使用$.extend(pluginName: function())$.fn.pluginName = function() 是否更有效...与我得到的::overwhelming:: (haha) 响应,我确定@987654327 @ 可能会快一点 - stackoverflow.com/questions/2145320/…
    • 您可能是对的,尽管$.fn.extend 只是“感觉”是一种更好、更正式的方式。速度差异很小。
    【解决方案2】:

    我发现official jQuery plugin authoring guide 非常好,还有this article at Learning jQuery 可以帮助您更好地了解正在发生的事情。

    【讨论】:

      【解决方案3】:

      好的,感谢 Queness 教程,我 99% 都成功了!干杯 对链接不满。一切都很好,只是现在我的模态窗口不会关闭。那应该是一个单独的“关闭”功能还是什么?这是新代码:

      <script type="text/javascript">
      (function($){
      $.fn.extend({
          mynewmodal: function(options) {
      
         var defaults = {
                         container: "#modalcontainer"
                };
              var options = $.extend(defaults, options);
              return this.each(function() {
                  var o =options;
                  // Add our click OPEN event
                  $(this).click(function (e) {
                      e.preventDefault();
                      // Add our overlay div
                      $('body').append('<div id="overlay" />');
                      // Fade in overlay
                      $('#overlay').css({"display":"block","opacity":"0"}).animate({"opacity":"0.2"}, 300),
                      // Animate our modal window into view
                      $(o.container).css({"top":"43%", "opacity":"0"}).show().animate({"top": "50%", "opacity": "1"}, 550),
                      // Add our close image
                      $(o.container).append('<div id="modal-vid-close" title="Close window" />');
                      // Add our click CLOSE event
                      $('#overlay', '#modal-vid-close').click(function () {
                          //Animate our modal window out of view
                          $(o.container).animate({"top": "55%", "opacity": "0"}, 350).fadeOut(200),
                          // Fade out and remove our overlay 
                          $('#overlay').fadeOut(200, function () { $(this).remove(); $('#modal-vid-close').remove()} )
                      });
                  });
              });
          }
      });
      })(jQuery);
      </script>
      

      然后启动它:

      <script type="text/javascript">
      var $j = jQuery.noConflict();
      $j(document).ready( function() {
      $j('.video_container a').mynewmodal({ container: "#video" });
      });
      </script>
      

      【讨论】:

      • 我认为问题在于关闭链接中的这一行 click() handler: $(o.container).animate({"top": "55%", "opacity": "0"}, 350).fadeOut(200), - o.container 在插件代码完成执行时将超出范围。尝试将o.container 替换为'#overlay',如下行所示。
      • 不,不这样做。还有什么想法吗?
      • 好的,我上传了一个jsbin例子。您可以看到在“关闭窗口”部分之前一切正常 - jsbin.com/adere
      • 呸,我是不是把选择器写错了——应该写成 $('#modal-vid-close, #video')...
      猜你喜欢
      • 2010-12-22
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多