解决Magento后台上传产品图片保存失败的问题

问题概述:Magento 1.5.1后台上传产品图片,点击上传,没效果,点击保存后更没数据(早期Magento版本貌似也有这种情况)。

出现JS错误:this.images.toJSON is not a function 在 /js/mage/adminhtml/product.js
行:122这个位置

经过一番努力二番调试三番四次不断纠结,总算解决问题这个保存上传图片失败的问题。

处理:在/js/mage/adminhtml/product.js这个js文件里,搜索“this.images.toJSON()”,在122行和177行这两处出现,均为“this.getElement('save').value = this.images.toJSON();”

把这两个地方的"this.images.toJSON()"替换成“Object.toJSON(this.images)”,保存后就解决问题。

PS,,MS某个插件引发Magento这个后台上传产品图片失败的问题。

magiczoom放大镜手动破解

好用的东西一般有版权。。又让好多人讨厌版权。。。

magiczoom放大镜版权效果

js的放大镜插件magiczoom算来是还不错的,要纯js所以以前的jQuery的放大镜插件就不能用了。

野根草民如我,肯定不想花银子买正版,顺手破解magiczoom的版权。

对magiczoom.js解密,看源码,最后找到

^bko}k.{~i|ojk.za.h{bb.xk|}ga`.ah.Coigm.Taac(-6:6<5    #LINE1461

这句,这句经过“.update(MagicZoom.x7(a[0]))”(#LINE1535)后就成了邪恶的版权信息“Please upgrade to full version of Magic Zoom TM
”。

惹人厌啊惹人厌。

magiczoom放大镜破解效果

删掉后在加密下,magiczoom放大镜破解
成功,版权已经没了。

顺带DEMO:magiczoom破解版效果

JS限制浏览器的最小宽高

通过js限制浏览器的最小宽度和高度的小代码。。

<script type="text/javascript">
var lch = 300, lcw = 400;
window.moveTo(0, 0);
//window.resizeTo(800, 600);
window.onresize = new Function("if(document.documentElement.clientHeight<lch||document.documentElement.clientWidth<lcw){window.resizeTo(800, 600);}");
</script>
标签: 浏览器, js, 限制, ,

js利用google翻译接口把网页翻译成各国语言

网页翻译为德语(Translate Page To German)

<a href="javascript: void(window.open('http://translate.google.com/translate?u='+escape(location.href)+'&amp;langpair=en%7Cde', 'English_to_German', 'resizable,scrollbars,status'))">网页翻译为德语(Translate Page To German)</a>

网页翻译为西班牙语(Translate Page To Spanish)

<a href="javascript: void(window.open('http://translate.google.com/translate?u='+escape(location.href)+'&amp;langpair=en%7Ces', 'English_to_Spanish', 'resizable,scrollbars,status'))">网页翻译为西班牙语(Translate Page To Spanish)</a>

网页翻译为法语(Translate Page To French)

<a href="javascript: void(window.open('http://translate.google.com/translate?u='+escape(location.href)+'&amp;langpair=en%7Cfr', 'English_to_French', 'resizable,scrollbars,status'))">网页翻译为法语(Translate Page To French)</a>

网页翻译为意大利语(Translate Page To Italian)

<a href="javascript: void(window.open('http://translate.google.com/translate?u='+escape(location.href)+'&amp;langpair=en%7Cit', 'English_to_Italian', 'resizable,scrollbars,status'))">网页翻译为意大利语(Translate Page To Italian)</a>

网页翻译为日语(Translate Page To Japanese)

<a href="javascript: void(window.open('http://translate.google.com/translate?u='+escape(location.href)+'&amp;langpair=en%7Cja', 'English_to_Japanese', 'resizable,scrollbars,status'))">网页翻译为日语(Translate Page To Japanese)</a>

网页翻译为韩语(Translate Page To Korean)

<a href="javascript: void(window.open('http://translate.google.com/translate?u='+escape(location.href)+'&amp;langpair=en%7Cko', 'English_to_Korean', 'resizable,scrollbars,status'))">网页翻译为韩语(Translate Page To Korean)</a>

网页翻译为葡萄牙语(Translate Page To Portuguese)

<a href="javascript: void(window.open('http://translate.google.com/translate?u='+escape(location.href)+'&amp;langpair=en%7Cpt', 'English_to_Portuguese', 'resizable,scrollbars,status'))">网页翻译为葡萄牙语(Translate Page To Portuguese)</a>

网页翻译为汉语(Translate Page To Chinese)

<a href="javascript: void(window.open('http://translate.google.com/translate?u='+escape(location.href)+'&amp;langpair=en%7Czh-CN', 'English_to_Chinese', 'resizable,scrollbars,status'))">网页翻译为汉语(Translate Page To Chinese)</a>

网页翻译为俄罗斯语(Translate Page To Russian)

<a href="javascript: void(window.open('http://translate.google.com/translate?u='+escape(location.href)+'&amp;langpair=en%7Cru', 'English_to_Russian', 'resizable,scrollbars,status'))">网页翻译为俄罗斯语(Translate Page To Russian)</a>

网页翻译为荷兰语(Translate Page To Dutch)

<a href="javascript: void(window.open('http://translate.google.com/translate?u='+escape(location.href)+'&amp;langpair=en%7Cnl', 'English_to_Dutch', 'resizable,scrollbars,status'))">网页翻译为荷兰语(Translate Page To Dutch)</a>

网页翻译为丹麦语(Translate Page To Denmark)

<a href="javascript: void(window.open('http://translate.google.com/translate?u='+escape(location.href)+'&amp;langpair=en%7Cda', 'English_to_Denmark', 'resizable,scrollbars,status'))">网页翻译为丹麦语(Translate Page To Denmark)</a>

另外一篇相关的:js-使用google翻译接口API

Javascript高效简洁代码的编写及优化技巧

 

真假的判断


Javascript
中有null、undefined、string、number、boolean五种基本的类型,一般判断真假或者为空的时候大家会使用下面的代码:

if(a==true){
    //doSomeTing();
}

但是这种方法很不简洁,我们完全可以使用1,0来判断,比如我们设定一个a,如果a为假,我们就改成真,而a在程序后面可能用于判断,最简单也是最好理解的方法就是下面的写法

var a=false;
if(a==false){
    a=true;
}

既然提到了0,1,肯定有人想到了第二种写法:

var a=0;
if(!a){
    a=1;
}

这个代码还可以进一步简写优化,就是使用js的三元运算符,也就是三目运算符:

var a=0;
!a?a=1?null;

还有一点,对于空字符串的判断,往往采用if(a==”"),其实对于空字符本身就是false,下面我总结了下Javascript中的真假值,希望对大家有用
 


JavaScript 中的真假值
类型 真假值
Null 总是为假(false)
Undefined 总是为假(false)
Boolean 保持真假值不变
Number +0,-0 或是 NaN 的时候为假,其它值为真
String 空字符串的时候为假,其它值为真
Object 总是为真(true)

 


组跟对象的定义


对于类似下面的正统数组跟对象的定义

var a=new Array;
var b=new obj;
obj.name="WYQ";
obj.webSite="http://www.2fool.cn";

我们可以使用

var a=[];
var b={name:"WYQ",webSite:"http://www.2fool.cn"};

来代替


环的控制


在使用循环遍历时候要注意提前把长度或者要计算的长度记录下来,如下面的写法

var list = document.getElementsByTagName('p');
for (var i = 0, l = list.length; i < l; i++) {//注意此处把list的长度提前计算出来,避免了每次循环重复计算
    ……
}

注意循环体内部的写法,该放在外面的放在外面如下面的代码

var list = $(".abc");
for (var i = 0, l = list.length; i < l; i++) {//注意此处把list的长度提前计算出来,避免了每次循环重复计算
    var a=list[i].html();
    $("#abc").after(a);
}

我们分析一下:每次循环的时候,都要首先解析$(”#abc”);势必效率变低,接着在使用after插入到#abc中去。这样子写效率会很低的,而下面的写法就高效了

var list = $(".abc");
var b = $("#abc");
for (var i = 0, l = list.length; i < l; i++) {//注意此处把list的长度提前计算出来,避免了每次循环重复计算
    var a=list[i].html();
    b.after(a);
}

这样的写法还不是最高效的,看下面的方法

var list = $(".abc");
var b = "";
for (var i = 0, l = list.length; i < l; i++) {//注意此处把list的长度提前计算出来,避免了每次循环重复计算
    b+=list[i].html();
}
$("#abc").after(b);

看似简单的Javascript代码,其实要做的功夫很多!


while还是for?


对于我来说,那个使用的方便,那个用的变量少使用那个,如对顺序没有关系的循环可以使用while,如下面的两段代码,前者使用了for,后者使用了while,两者明显while使用的变量少,虽然for容易使大家理解

//使用for
var arr = [1,2,3,4,5,6,7];
var sum = 0;
for (var i = 0, l = arr.length; i < l; i++) {
    sum += arr[i];
}   
//使用while
var arr = [1,2,3,4,5,6,7];
var sum = 0, l = arr.length;
while (l--) {
    sum += arr[l];
}


件判断的优化技巧


1、对于可能性的排列按照从高到底的顺序进行排列

原因很简单,可以减少程序的试探次数。
2、使用三目运算符三目运算符比if else判断语句效率高,而且往往代码比较简洁如下面的两段代码

//使用if else
if (a > b) {
    num = a;
} else {
    num = b;
}
//三目运算符
num = a > b ? a : b;
//谁说三目不能代替if else的function?
c=a>b?function(){
            }:function(){
                 };
c();

使用switch 代替if对于同一个条件不同情况的判断,使用switch简洁易懂,并且switch本身比if效率要高,在IE下尤为明显!


=与===的区别


看过jQuery
源码的朋友发现,其中很多使用的是===,而不是==,这是因为===的效率比==要高,但是使用===要注意,===不会进行类型的转换,比如如果你确定比较两者类型相同,推荐使用===,这也是大家在编写代码时候自己细节的养成。当然也有一定的注意情况,下面仔细的说说==跟===的区别


=== 操作符的判断算法

在使用 === 来判断两个值是否相等的时候,如判断x===y,会首先比较两个值的类型是否相等,如果不相等的话,直接返回 false 。接着根据 x 的类型有不同的判断逻辑。

如果 x 的类型是 Undefined 或 Null,则返回 true 。
如果 x 的类型是 Number,只要 x 或 y 中有一个值为 NaN,就返回 false ;如果 x 和 y 的数字值相等,就返回 true ;如果 x 或 y 中有一个是 +0,另外一个是 -0,则返回 true 。
如果 x 的类型是 String,当 x 和 y 的字符序列完全相同时返回 true,否则返回 false 。
如果 x 的类型是 Boolean,当 x 和 y 同为 true 或 false 时返回 true,否则返回 false 。
当 x 和 y 引用相同的对象时返回 true,否则返回 false 。
== 操作符的判断算法

在使用 == 来判断两个值是否相等的时候,如判断x==y,当 x 和 y 的类型一样的时候,判断逻辑与 === 一样;如果 x 和 y 的类型不一样,== 不是简单的返回 false,而是会做一定的类型转换。

如果 x 和 y 中有一个是 null,另外一个是 undefined 的话,返回 true 。如null == undefined。
如果 x 和 y 中一个的类型是 String,另外一个的类型是 Number 的话,会将 String 类型的值转换成 Number 来比较。如3 == “3″。
如果 x 和 y 中一个的类型是 Boolean 的话,会将 Boolean 类型的值转换成 Number 来比较。如true == 1、true == “1″
如果 x 和 y 中一个的类型是 String 或 Number,另外一个的类型是 Object 的话,会将 Object 类型的值转换成基本类型来比较。如[3,4] == “3,4″
需要注意的是 == 操作符不一定是传递的,即从A == B, B == C并不能一定得出A == C。考虑下面的例子,var str1 = new String(”Hello”); var str2 = new String(”Hello”); str1 == “Hello”; str2 == “Hello”,但是str1 != str2。


ypeof使用时候注意


对于同一个var a=”abc”;
在FF下typeof a==string 返回 true
在IE下返回false,IE就是这样的娇贵!
推荐写法:


typeof a==”string”


后,尽量避免使用eval等语句!


eval、Function、execScript等语句会再次使用javascript解析引擎进行解析,需要消耗大量的执行时间。

标签: js, 优化