2013年3月 的存檔

jquery 操作select radio box 備忘

2013年3月31日 沒有評論

select框操作

獲取值
$('#select').val()

設置值為xx的項為選中
$('#select').val(xx)

設置文本信息為yy的項為選中
$('#select option[text="yy"]').attr("selected", true);

radio box 操作

獲取值
$('input[name="xx"]:checked').val()

設置值為xx的為選中
$('input[name="xx"]:radio[value="yy"]').attr('checked', 'checked');

jquery 獲取父節點

2013年3月31日 沒有評論

在使用jquery時,很多時候都需要獲取當前節點的父節點,包括直接父節點和祖先父節點。用的最多的方法是parent([expr])和parents([expr])。從方法的名字上就可以判斷前一個方法是單數,也就是返回一個真正的父節點,后面是返回所有的祖先節點集合(不包含根節點)。假設需要獲取當前節點的祖父節點(父節點的父節點),其有屬性class=”pp”,那么獲取的方法為:

$('#cur').parent().parent();
或
$('#cur').parent().parent('.pp');
或
$('#cur').parent('.pp');

上述操作在理想情況下,都沒有問題。例如后來修改頁面,在當前節點上又加了一個父節點,那么前兩種獲取的到的節點就不是當初節點;另外如果其祖先節點中還有屬性class=”pp” 的節點,第三種獲取的節點也不是自己想要的。

現在介紹另外一個獲取父節點的方法closest([expr])。closest會首先檢查當前元素是否匹配,如果匹配則直接返回元素本身。如果不匹配則向上查找父元素,一層一層往上,直到找到匹配選擇器的元素。否則返回一個空的jquery對象。

$('#cur').closest('.pp');

使用上述操作獲取含義特定屬性的祖父節點相對要安全一些,即使在當前節點和祖父節點中增加或者減少節點,只要增加的節點沒有相同的屬性,已有的js代碼可能都不需要進行修改。

最后說一下closest和parents的主要區別是:

  1. 前者從當前元素開始匹配尋找,后者從父元素開始匹配尋找
  2. 前者逐級向上查找,直到發現匹配的元素后 就停止了,后者一直向上查找直到根元素,然后把這些元素放進一個臨時集合中,再用給定的選擇器表達式去過濾
  3. 前者返回0或1個元素,后者可能包含0 個,1個,或者多個元素
分類: web前端 標簽:

js做大小比較時警惕對象類型

2013年3月27日 沒有評論

通過js獲取頁面兩個數字輸入框的值,并對其進行大小比較。此時出來的結果可能讓你迷惑不解,例如代碼:

    var v1 = $('#input1').val();
    var v2 = $('#input2').val();

    alert(v1 > v2);

假如input1中輸入10,input2中輸入2。10肯定是大于2的,所以上面的alert框應該彈出true,但實際上給出的是false。原因何在?對應數字10大于2是毫無疑問的,如果是作為字符串比較,那么結果剛好相反。而上述從頁面獲取值得到的類型是String。

如果明確是要進行數字比較,則需要顯示的轉化為數字,例如使用parseInt、parseFloat;還有一種方法是使用減法運算符,如:v1 – v2 > 0,此時js在運算前內部會進行類型轉換。

另外由于加法運算符同時支持數字和字符串,使用這個時候也要小心。例如 a + b ,如果其中一個是字符串類型,一個是數字類型,在執行運算前會把另外一個轉化為字符串類型,所以實際是進行字符串鏈接操作,而不是想要的算術運算。在確定是要做算術運算的情況下,對于未知類型的參數,保險的情況下還是使用parseInt進行類型轉換。

分類: web前端 標簽:

js 快速排序引出參數傳遞是傳值還是傳引用

2013年3月27日 沒有評論

http://www.ruanyifeng.com/blog/2011/04/quicksort_in_javascript.html這篇文章中詳細描述了快速排序的原理,同時也給出了javascript的實現,其具體代碼如下:

function quickSort(arr) {
    if (arr.length <= 1) {
        return arr;
    }

    var pivotIndex = Math.floor(arr.length / 2);
    var pivot = arr.splice(pivotIndex, 1)[0];
    var left = [];
    var right = [];

    for (var i = 0; i < arr.length; i++) {
        if (arr[i] < pivot) {
            left.push(arr[i]);
        } else {
            right.push(arr[i]);
        }
    }

    return quickSort(left).concat([pivot], quickSort(right));
}

上述代碼也是比較通俗易懂,自己生成一個隨機數組測試,排序正確,所以功能上也沒有問題。但上述代碼還是有一個隱藏的小bug,當對同一個數組調用兩次quickSort,發現第二次條用后出來的元素數量會比原始數據少一個。導致這個問題是根源是arr.splice(pivotIndex, 1)[0],它會把arr中指定位置的元素刪掉。其操作是針對該方法的參數,但是同時影響到了傳給方法的實際數組,所以結論是javascript中數組參數的是傳引用(地址),而非傳值

為了不影響原始數組數據,可以對上述代碼進行一個小修改,修改后的代碼如下:

function quickSort(arr) {
    if (arr.length <= 1) {
        return arr;
    }

    var pivotIndex = Math.floor(arr.length / 2);
    var pivot = arr[pivotIndex];
    var left = [];
    var right = [];

    for (var i = 0; i < arr.length; i++) {
        if (i == pivotIndex) {
            continue;
        }

        if (arr[i] < pivot) {
            left.push(arr[i]);
        } else {
            right.push(arr[i]);
        }
    }

    return quickSort(left).concat([pivot], quickSort(right));
}

js定義多行字符串

2013年3月12日 1 條評論

當使用js來操作html,經常遇到需要處理多行字符串的問題,如果采用一行或多行拼接的方式都不好維護。像python、php中提供多行字符串的定義方式,真是方便不少。例如:

python
pstr = '''
line1
    line2
    line3
line4	  
'''

php 
$pstr = <<<eof
line1
    line2
    line3
line4
eof

上述定義完全保留字符串中的所有字符,包括回車換行已經引號等。

js本身沒有提供類似的定義方式,但是可以通過多行注釋(/* */),已經借助function的方式來達到多行字符的定義,例如代碼:

var jstr = function() {
    var fun = function() {
    /*line1
        line2
        line3
    line4*/
    }
    var lines = new String(fun);
    
    return lines.substring(lines.indexOf("/*") + 3, 
                           lines.lastIndexOf("*/"));
}
分類: web前端 標簽:

IE 6下cookie寫入失敗

2013年3月4日 1 條評論

一個簡單的頁面在加載的時候種植一個cookie,其他瀏覽器都能成功寫入,測試IE 6時始終無法寫入。由于是本地指定的一個測試三級子域,一度以為是域名長度問題,通過測試其他域名,排除了此問題。后來發現這個域名中使用了下劃線,查了一下域名命名規范,規范規定域名只能是字母、數字和-(中劃線)的組合,顯然這不是一個規范的域名,IE 6自身機制拒絕種植cookie,所以導致失敗。

想起曾經也碰到過IE 6通過js的方法無法在domain字符串少于5個字符的情況。也是源于IE 6自身的安全機制考慮的,可能在開發IE 6的時候還沒有例如cn、uk、au之類的域名,其想當然的認為域名至少超過5個字符吧。

分類: web前端 標簽:

mysql 查看數據庫中所有表的記錄數

2013年3月3日 沒有評論

mysql使用select count(*) from table_name可以查詢某個表的總記錄數。想快速的知道數據庫中所有表的記錄數信息怎么辦?如果使用mysql的版本在5.0及以上,可以通過查詢information_schema庫中的tables表來獲取,該表中使用table_rows記錄表的行數信息。例如查看庫testdb中所有表的記錄數:

use information_schema;

select table_name,table_rows from tables 
where TABLE_SCHEMA = 'testdb' 
order by table_rows desc; 

不過需要注意的是,對于InnoDB表,table_rows行計數僅是大概估計值。

另外一種辦法還是借助information_schema庫的tables表,來拼接出一個條sql語句,例如:

use information_schema;

select concat(
    'select "', 
    TABLE_name, 
    '", count(*) from ', 
    TABLE_SCHEMA, 
    '.',
    TABLE_name,
    ' union all'
) from tables 
where TABLE_SCHEMA='testdb';

把生成的結果手動加工一下就行了,起碼比一張張表去拼寫要來的快。

無覓相關文章插件,快速提升流量

30选5怎么中奖