如何将这些常用的javascript代码转换为插件

How do I turn this commonly used javascript code into a plugin?

本文关键字:代码 javascript 转换 插件 常用      更新时间:2023-09-26

概述

我正在开发一个基于Wordpress的网站,允许访问者在页面上的几个不同位置上传图像。我(经过大量的尝试和错误)得到了一些工作代码,但由于每个"上传"区域的代码只略有不同,我想尝试以"插件"的形式使其可重复使用。

我的背景

我是一个自学成才的程序员,所以我很容易犯很多错误,用完全不合逻辑的方式做事,再加上写一千行代码,而一行就足够了。

问题历史记录(请跳过此部分查看下面的代码)

我想我会加入一些历史,这样我就不会触犯X-Y问题。我在网页上有4个地方,访问者可以上传到网站。其中3个是图像上传,应该允许访问者也"裁剪"图像。我使用jQuery插件plupload和jcrop来提供功能。

最初,我试图以这样一种方式编写代码,即页面在执行时将相关代码包含在DOM中。为了在同一页面上有多个plupload实例,我创建了一个"动态变量",然后调用这样的代码。。。

var dynamicPartOfVar = "imageUploadAreaOne";
imageManipulationObject["imageUploader"+dynamicPartOfVar] = new plupload.Uploader(plupload_init);

这(在某种程度上)起了作用,但我发现,如果代码在DOM中,那么浏览器就不会缓存它。因此,我为每个上传区域创建了一个单独的js文件,并"包括"它们,并用传递相关变量

wp_localize_script("imageUploadAreaOne", "inputVar", $relevantVariableArray);
wp_enqueue_script("imageUploadAreaOne");

然而,我很快意识到,如果我可以将不同的变量"传入"同一个文件,我就可以只生成一组代码,并(例如)传递一个名为"allowCropping"的变量,该变量将启用/禁用jCrop等。

问题

我有这样的代码(只是一个例子):

var isAdmin = inputVar.isAdmin;
var notAdmin = inputVar.notAdmin;
var thisUser = inputVar.thisUser;
var ajaxurl = inputVar.ajaxurl;
imageManipulationObject["imageUploader"+dynamicPartOfVar] = new plupload.Uploader(plupload_init);   
imageManipulationObject["ProgressLoader"+dynamicPartOfVar] = $('#ProgressLoader'+dynamicPartOfVar).percentageLoader({width: 170, height: 170, progress:0.0});
/* **************************** */
// HIDE CROPPING DIV WHEN USER SELECTS A DIFFERENT IMAGE
/* **************************** */
$('.imageSelection').on('click', function() {   
    closeCropWindow();
});
$('.imageThumb').on('click', function() {   
    closeCropWindow();
});

HTML示例

<div id="mainCropDivID<?php echo $this->dynamicPartOfVar; ?>">
    <div class="outerCropDiv">
    <div id="innerCropDivID<?php echo $this->dynamicPartOfVar; ?>" class="innerCropDiv">
    <img class="croppingImage" id="croppingImageID<?php echo $this->dynamicPartOfVar; ?>" alt="Cropping Image" src="<?php echo $currentURL; ?>"/>
    <div class="JTcentreDiv">
    <form id="cropimg<?php echo $this->dynamicPartOfVar; ?>" name="cropimg" method="post" action="<?php echo $getPartOfURL; ?>">
    <input type="hidden" id="x_<?php echo $this->dynamicPartOfVar; ?>" name="x">
    <input type="hidden" id="y_<?php echo $this->dynamicPartOfVar; ?>" name="y">
    <input type="hidden" id="w_<?php echo $this->dynamicPartOfVar; ?>" name="w">
    <input type="hidden" id="h_<?php echo $this->dynamicPartOfVar; ?>" name="h">
    <input type="hidden" name="typeOfImage" value="<?php echo $this->typeOfImage; ?>">
    <input type="hidden" id="imageIDtoCrop<?php echo $this->dynamicPartOfVar; ?>" name="imageIDtoCrop" value="">
    <input id="performCropButton<?php echo $this->dynamicPartOfVar; ?>" type="submit" value="Crop Image">
    </form>
    </div>
    </div><!-- @end #innerCropDivID -->  
    </div><!-- @end .outerCropDiv --> 
    <div style="clear:both;">&nbsp;</div>   
</div> <!-- @end #mainCropDivID --> 

假设将这一切封装在一个"插件"中是可行的。我该怎么做呢?我希望能够将包含多个DOM元素的变量传递到插件中(即,我希望将保存需要裁剪的图像的div、保存图像预览的div、存储当前上传图像的div等)。加上其他变量,例如是否允许"裁剪"。

谢谢你的帮助。

您需要创建一个新的JS文件(它将成为您的插件)这需要的代码是

(function ($) {
$.fn.myFunctionPlugin= function (options) {
var defaults = {
    };
    var settings = $.extend(true, {}, defaults, options);
}
function dosomthing()
{
//CODE HERE
}
} (jQuery));

在你的页面上添加对插件的引用(就像你添加对jquery或任何其他第三方js的引用一样)

<script src="...Reference" type="text/javascript"></script>

在同一页面上添加另一个脚本段

<script type="text/javascript">
$(function() {
    var options = {actionToPerform:"...",//This may be a controller action performed
 idcalss="....." //Class of the item on the view you want to pass in}
 $('.someclass').jsFunction(options);
 });

附言:请参阅《JQuery in action》一书,第二版,第205页

一个简单的jquery插件编写参考:jquery插件示例