【问题标题】:How do I turn this commonly used javascript code into a plugin?如何将这个常用的 javascript 代码转换为插件?
【发布时间】:2014-09-19 07:41:22
【问题描述】:

概述

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

我的背景

我是一名自学成才的程序员,所以我很容易犯很多错误,并且以完全不合逻辑的方式做事,而且在一行就足够的情况下编写了一千行代码。

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

我想我会包含一些历史记录,以免与X-Y Problem 发生冲突。我在网页上有 4 个地方可供访问者上传到网站。其中 3 个是图像上传,应该允许访问者也“裁剪”图像。我正在使用 jQuery 插件 pluploadjcrop 来提供功能。

最初,我尝试以页面在执行时将相关代码包含在 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保存当前上传的图像等)。加上其他变量,例如是否允许“裁剪”。

感谢您的帮助。

【问题讨论】:

  • 所以你想将插件绑定到主要的图像元素? html 结构看起来如何(预览、上传 div 等)?
  • @Johan 我添加了一些 HTML 的示例。绘制所需元素的所有功能都在单独的函数中。例如,绘制打开裁剪窗口按钮的功能,仅在“裁剪”功能可用等情况下才需要。希望有所帮助。如果您需要更多信息,请告诉我。

标签: javascript php jquery wordpress


【解决方案1】:

你需要创建一个新的 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);
 });

PS:请参阅本书 JQuery in action 第二版,第 205 页

一个简单的jquery插件编写参考:jquery plugin example

【讨论】:

  • 嗨,杰克,感谢您的回答。我很难看到您如何将页面 $('.someclass'.jsFunction(options) 上的函数调用链接到 $.fn.myFunctionPlugin ?它怎么知道 myFunctionPlugin 在哪里?如果我遗漏了一些明显的东西,请道歉在这里。谢谢。
  • 因为您已经在要使用它的页面中添加了对插件的引用。基本上它与 jquery 相同,当你想使用它时,你把对 jquery 的引用放在页面上,然后你编写你的 javascript 代码,包括 jquery 函数。所以用你的插件替换 jquery 以了解它是如何工作的。如果你使用jquery的源文件,然后做一个小的js函数来改变颜色,你会更好地理解它,甚至可以很容易
  • 其实你应该使用$.fn.extend({'myFunctionPlugin':function(){[...]}});或者$.fn.prototype.myFunctionPlugin=function(){[...]}。这种方式可行,但这种方式更正确。
  • 我是否正确地认为可以从插件中调用其他插件(即我可以使用 plupload / jcrop 等,但在插件的封装内是一样的?)
  • 但是你在使用 JQuery 的时候已经在这样做了,但是如果它是你为你的应用程序编写的插件,那将是一个非常糟糕的编码参考 SOLID 原则
猜你喜欢
  • 1970-01-01
  • 2021-01-27
  • 2012-02-25
  • 2022-12-02
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
相关资源
最近更新 更多