函数未定义,参数格式化

时间:2015-02-01 16:53:25

标签: javascript jquery

我正在尝试创建自己的灯箱脚本,我可以在这里以干净的格式传递变量(标题,描述,项目类型,itemid等)(灵感来自fancybox):

myFunction({ 
    title: "My title",
    description: "My description" 
});

单击某个元素会将一些HTML预先添加到带有jQuery的div。

我已经调整了我在Stackoverflow上找到的一段代码,并且"有点"理解代码。在编辑底部代码之前,top函数没有更改和工作,我添加了click(function() { },因为在示例中代码是在pageload上执行的。

然而,当我点击我的H1元素时,firebug控制台告诉我 ReferenceError:弹出窗口未定义

这是我的Javascript:

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

        $.fn.popup = function (options) {
            var settings = $.extend({
                title: function (someData) {
                    return someData;
                },
                description: function (someData) {
                    return someData;
                },
            }, options);
            $("#content").prepend(
                "<div style=\"position:fixed;top:0;left:0;width:100%;height:100%;background:#FFFFFF;\">\
                    <h1>"+ settings.title +"</h1>\
                    <p>" + settings.description +"</p>\
                </div>"
            );
        }; 
    }(jQuery));

    $(".openbox1").click(function() {
        popup({
            title: "Title 1",
            description: "Description 1"
        });
    }));

    $(".openbox2").click(function() {
        popup({
            title: "Title 2",
            description: "Description 2"
        });
    }));
});

这是我的HTML

<div id="content">
    <h1 class="openbox1">open box 1</h1>
    <h1 class="openbox2">open box 2</h1>
</div>

2 个答案:

答案 0 :(得分:2)

一个。 Wolff评论说我需要执行这样的函数:

$(".openbox1").click(function() {
    $(this).popup({
        ...
    });
});

这解决了,谢谢!

答案 1 :(得分:1)

首先,你做了什么,我希望这会有所帮助:

//  This, of course is same as "document.onload"
//  Don't confuse it with "window.onload" 
//  wich will wait till WHOLE dom is loaded to run any script
$(document).ready(function() {
    (function ($) {
        //  This is, in essence, the start of a jQuery plugin
        //  This is often referred to as the "quick and dirty setup"
        //  as it's a direct call to add a method to jQuery's 
        //  element object. Meaning it can be recalled as 
        //  $(element).popup().
        //  This should not be confused with $.popup = function
        //  which would just add a method to jQuery's core object
        $.fn.popup = function (options) {
            var settings = $.extend({
            ...
    }(jQuery));

    $(".openbox1").click(function() {
        //   here is where your issue comes in
        //  as previously noted, you did not create a 
        //  method named "popup".
        //  you added a method to jQuery's Element Object
        //  called "popup".
        //  This is why `$(this).popup` works and
        //  plain `popup` does not.
        //  You're inside an "event" asigned to any element 
        //  having class name `openbox1`. Thus, any call
        //  in here to `this`, will reference that element
        popup({

其次,如何编写它的另一个例子。我不会说得更好,因为即使我说我的方式更好,它也不会让你的纠正&#34;方式错了。在Javascript中,正如那句老话:There's more than one way to skin a cat

我的例子:

&#13;
&#13;
//	Notice I'm adding this plugin BEFORE the document load.
//	This means, you could easily add this to a file and load it 
//	in script tags like any other Javascript, 
//	as long as it's loaded AFTER jquery.
(function($) {
    //    this ensures that your plugin name is available and not previously added to jQuery library
    if (!$.popup) {
        //    this also provides us "variable scope" within to work in

        // here begin adding the plugin to jQuery
        // I started with $.extend, so it can be added to the jQuery library and used in traditional format
        //    $.popup('element selector', { options })
        // as well as the element.action format we'll add later
        //    $.(element selector).popup({ options })
        // This should help give you a good idea of the whole of what all is going on
        $.extend({
            popup: function() {
                var ele = arguments[0],    //    this is our jQuery element
                    args = Array.prototype.slice.call(arguments, 1);    //    this gets the rest of the arguments
                
                // this next step is useful if you make the traditional call `$.popup(this, { options })`
                if (!(ele instanceof jQuery)) ele = $(ele);
                
                //    now we have total control! Bwahahha!
                // Fun aside, here is where it's good to check if you've already asigned this plugin
                //  if not, then make some "marker", so you can recall the element plugin and comment an 
                //    action instead of reinitializing it
                if (!ele.data('popup')) $.popup.init(ele, args);
                else {
                    // at this point, you would know the element already has this plugin initialized
                    //    so here you could change an initial options
                    //    like how with jQueryUI, you might would call:
                    //    $(element).popup('option', 'optionName', value)
                }
                return ele;
            }
        });
        //    here is where we add the $(element selector).popup method
        //    this simply adds the method to the element object
        //    If you don't fully understand what's going on inside (as I explain below),
        //    just know that it's some "fancy footwork" to pass the method onto our initial 
        //    method creation, $.popup
        $.fn.extend({
            popup: function(/*no need for parameter names here as arguments are evaluated inside and passed on to initial method*/) {
                //  set this element as first argument to fit with initial plugin method
                var args = [$(this)];
                //  if there are arguments/params/options/commands too be set, add them
                if (arguments.length) for (x in arguments) args.push(arguments[x]);
                //  pass through jquery and our arguments, end result provides same arguments as if the call was:
                //      $.popup($(element), options)
                return $.popup.apply($, args);
            }
        });
        //  This next part is not seen in many plugins but useful depending on what you're creating
        $.popup.init = function(ele, opt) {
            //    here is where we'll handle the "heavy work" of establishing a plugin on this element
            //    Start with setting the options for this plugin.
            //    This means extending the default options to use any passed in options
            //    In the most simple of cases, options are passed in as an Oject.
            //    However, that's not always the case, thus the reason for this being 
            //    a continued array of our arguments from earlier.
            //    We'll stick with the simplest case for now, your case, that the only options are an 
            //    Object that was passed in.
            //    using the extend method, with true, with a blank object, 
            //    allows us to added the new options "on top" of the default ones, without changing the default ones
            //    oh and the "true" part just tells extend to "dig deep" basically (multideminsional)
            if (opt && typeof opt[0] == 'object') opt = $.extend(true, {}, $.popup.defaults, opt[0]);
            var par = opt.parent instanceof jQuery ? opt.parent : $('body'),
                tit = opt.title,
                des = opt.description,
                //     this last one will be the wrapper element we put everything in
                //    you have this in yours, but it's written in a very long way
                //    this is jQuery simplified
                wrap = $('<div />', { style: 'position:fixed;top:0;left:0;width:100%;height:100%;background:#FFFFFF;' }),
                //    much like the previous element, cept this is where our title goes
                head = $('<h1 />', { text: tit }).appendTo(wrap),
                content = $('<p />', { text: des }).appendTo(wrap);
            $(par).append(wrap);
            // finally, add our marker i mentioned earlier
            ele.data('popup', opt);
            
            //    just adding the following cause i noticed there is no close
            //    fyi, i would change this plugin a little and make an actial "open" command, but that's another tutorial
            var closer = $('<span />', { text: '[x]', style: 'cursor:pointer;position:absolute;bottom:1em;right:1em;' });
            wrap.append(closer);
            closer.click(function(e) { ele.data('popup', false); wrap.remove(); });
        };
        $.popup.defaults = {    //  establish base properties here that can be over-written via .props, but their values should never truly change
            'parent': undefined, // added this to keep it dynamic, instead of always looking for an element ID'd as content
            title: '',
            description: ''
        };
    }
})(jQuery);

//    the following is basically jQuery shorthand for document.ready
$(function() {
    // i think you get the rest
  $(".openbox1").on('click', function(e) {
        $(this).popup({
            title: "Title 1",
            description: "Description 1",
            parent: $("#content")
        });
    })
    $(".openbox2").on('click', function(e) {
        $(this).popup({
            title: "Title 2",
            description: "Description 2",
            parent: $("#content")
        });
    })
})
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div id="content">
    <h1 class="openbox1">open box 1</h1>
    <h1 class="openbox2">open box 2</h1>
</div>
&#13;
&#13;
&#13;