顯示具有 Java 標籤的文章。 顯示所有文章
顯示具有 Java 標籤的文章。 顯示所有文章

2021年1月31日 星期日

[JSP] 當jQuery的click function內未明確寫出form.submit時,不會送出表單

這次遇到的跟上回([JSP] form.submit()在Chrome無法送出,但在IE正常,最後發現是因缺少submit button)很像,根本原因都是由於Chrome與IE在解構時的差異,

一樣是Chrome較嚴謹,而IE會對於submit button有隱含的處理方式。

由於已經有上次的經驗,這次同樣也是往form.submit的方向去追,果然是此緣故。


情境說明:以前在IE運作的程式可以送出表單,但到了Chrome卻沒有反應。

分析問題:

1.根據先前的經驗,先檢查該表單是否為完整的form (有設定id, name, action)。

2.並檢查表單內是否有submit button,雖然表單中的submit按鈕是依判斷條件決定是否顯示,但可以按下按鈕時(判斷條件成立),看網頁的原始碼有正常出現,也就是當按鈕顯示時,瀏覽器應該可以正常抓到submit button。

3.檢查結果:表單設定完整,且該表單中有submit button,因此問題應非發生於HTML的部分。

4.本表單是在submit button按下click的時候,以jQuery控制送出。

5.往按鈕綁定的click function去追,發現Chrome有執行函式裡的動作:將按鈕disabled,但沒有後續送出表單動作。


問題解決:

1.直接推斷應該是要明確的寫出form.submit,Chrome才會送出表單,果然解決問題。

2.而IE則是不管有沒有寫form.submit,都會自動腦補,也就是submit button按下時隱含著將自動送出表單。


程式範例:

<!--HTML部分-->

<form id="testForm" name="testForm" action="test.jsp">

<%if(判斷條件成立){%>

<input type="submit" value="送出" id="submitButton"/>

<%}else{%>

<div id="testDiv">判斷條件成立才顯示按鈕</div>

<%}%>

</form>


//jQuery部分,綁定按鈕click時要處理的動作

$('#submitButton').click(function () {

//將按鈕設成disabled       

$("#submitButton").attr("disabled", true).addClass('ui-state-disabled');         

//原本沒有此行,只有IE可以送出表單,而Chrome沒有反應

$("#testForm").submit(); 

//加入上一行之後,Chrome才會送出表單,不然只執行click function裡指定的動作(將按鈕disabled)

//在IE則是不管是否有寫出submit(),都會送出表單,沒寫時會送,寫了也是可以正常送

});


Copyright © 2021 JavaSparrowK All rights reserved.

版權所有‧謝絕轉載

2020年8月29日 星期六

[JSP] form.submit()在Chrome無法送出,但在IE正常,最後發現是因缺少submit button

● 問題:同樣的程式在IE可以送出表單,但Chrome卻無法送出。

● 情境說明:form.submit()的動作是寫在jQuery的$.ajax動作完成後,在success: function (response)裡送出表單。

● 釐清問題:

 1.原本以為是Chrome無法接受.submit寫法,因此往瀏覽器語法部份去找。試了以下幾種寫法,都還是沒有辦法產生表單

//結果跟submit一樣,什麼都沒發生

$( "#form1" ).submit(function( event ) {

alert( "Handler for .submit() called." );

    event.preventDefault();

});

//結果跟submit一樣,什麼都沒發生

$('#form1').on('submit',function(e) {

if($('#rpt').val() === "poop"){ //Sample error check

    e.preventDefault();

    alert($('#rpt').val());

    }

});

//至少表單有送出,但是沒有開新視窗執行

var varForm = $(document.getElementsByName("form1"));

var tmp=varForm.attr('action');

$.post(tmp, varForm.serialize()); 


 2.找了幾篇文章後,有人提到可能是html元件的問題,發現這才是我的情況。

  我的情況是當情況A的時候,按下【查詢A】按鈕,要先觸發ajax,ajax成功時才呼叫form.submit()。

  情況B的時候,按下【查詢B】按鈕,直接做form.submit()。

<form id="form1" name="form1" method="post" action="Qry.jsp" target="_blank">

if(cond A){

<input type="button" id="queryA" value="查詢A">

}else{

<input type="submit" id="queryB" value="查詢B">

}


● 解決方法:眼尖的您是否已經發現當情況A(cond A)的時候,JSP畫面上是沒有submit按鈕的。

 也就是Chrome瀏覽器因為找不到submit按鈕,而無法進行form.submit的動作,因此什麼動作都沒進行;但IE可以在沒有按鈕的情況下繼續送出該表單。

 只要在情況A裡面加入一個隱藏的submit按鈕,Chrome就可以跟IE一樣正常執行form.submit。

<form id="form1" name="form1" method="post" action="Qry.jsp" target="_blank">

if(cond A){

<input type="button" id="queryA" value="查詢A">

<input type="submit" id="queryASubmit" value="送出A" hidden>

}else{

<input type="submit" id="queryB" value="查詢B">

}


● 參考資料

 1.Form SUBMIT not working in Chrome/3WA問題解決專家工作室

一開始是往這個方向去找,使用網頁中提到的$post寫法可以送出表單,但仍然無法達成我想要的開新視窗目的。

 2.Form Submit not Working in Chrome?/Stack Overflow

文中有人建議他修改button name,以及有人提到他的Chrome console也沒有報錯,但清除cache之後就可用,因此給了我可能是html元件問題的靈感,最後發現是因缺少submit button造成Chrome無法送出。


Copyright © 2020 JavaSparrowK All rights reserved.

版權所有‧謝絕轉載

2019年3月8日 星期五

[Java] 判斷字串內是否有數字以及判斷字串內的數字所在的index

  1. 使用str.matches(".*\\d+.*")判斷字串內是否有數字
    如 boolean containsNum1 = testStr1.matches(".*\\d+.*");
  2. 判斷字串內的數字所在的index
    先建立pattern、建立比對用的matcher,最後進行比對
import java.util.regex.*;

public class HelloWorld{

     public static void main(String []args){
        String testStr1 = "ABC1",
            testStr2 = "ABC99",
            testStr3 = "ABCDE";
        //判斷字串內是否有數字
        boolean containsNum1 = testStr1.matches(".*\\d+.*");
        boolean containsNum2 = testStr2.matches(".*\\d+.*");
        boolean containsNum3 = testStr3.matches(".*\\d+.*");
        System.out.println("containsNum1="+containsNum1);
        System.out.println("containsNum2="+containsNum2);
        System.out.println("containsNum3="+containsNum3);
       
        //以下兩種寫法都可以判斷出是否存在數字
        String patternStr1 = "\\d+";
        String patternStr2 = "[0-9]+";
        //建立pattern
        Pattern pattern1 = Pattern.compile(patternStr1);
        Pattern pattern2 = Pattern.compile(patternStr2);
        //建立比對用的matcher
        Matcher matcher1 = pattern1.matcher(testStr1);
        Matcher matcher2 = pattern2.matcher(testStr2);
        Matcher matcher3 = pattern1.matcher(testStr3);
        //取得數字所在的index,預設值為-1表示不存在,若存在會被設定成>0的整數
        int indexOfStr1 = -1,
            indexOfStr2 = -1,
            indexOfStr3 = -1;
        if(matcher1.find()){
            indexOfStr1 = matcher1.start();
        }

        System.out.println("字串"+testStr1+"的數字所在的index為"+indexOfStr1);
        if(matcher2.find()){
            indexOfStr2 = matcher2.start();
        }
        System.out.println("字串"+testStr2+"的數字所在的index為"+indexOfStr2);
        if(matcher3.find()){
            indexOfStr3 = matcher3.start();
        }
        //此輸出結果為-1,表示不存在數字
        System.out.println("字串"+testStr3+"的數字所在的index為"+indexOfStr3);
     }
}

線上執行請參考(點選左上角的Execute可看執行結果):http://tpcg.io/4z93pF
執行結果:
containsNum1=true
containsNum2=true
containsNum3=false
字串ABC1的數字所在的index為3
字串ABC99的數字所在的index為3
字串ABCDE的數字所在的index為-1

--------------------------------
參考網址
1. Check if a String contains numbers Java
以Java檢查String中是否存在數字

2. How to check if a string contains only digits in Java [duplicate]
如何以Java檢查String終只存在數字

3. Can Java String.indexOf() handle a regular expression as a parameter?
Java的String.indexOf()是否可傳入正規表示式

4. Why isn't the Java matches method working? (Java pattern matching)
為何Java的matches方法不能用

Copyright © 2019 JavaSparrowK All rights reserved.
版權所有‧謝絕轉載

2019年1月28日 星期一

[Java] Java 8 可使用Stream來判斷元素是否存在陣列中

import java.util.stream.*;
public static void main(String[] args){
        //以4種型態的陣列作範例
        String[] strArr = {"a", "b", "c"};
        Long[] longArr = {1234567890L, 2345678901L, 3456789012L};
        int[] intArr = {1, 2, 3};
        double[] doubleArr = {1.01, 2.02, 3.03};     
      
        //String 陣列使用Arrays.stream進行比對
        boolean strContains = Arrays.stream(strArr).anyMatch("b"::equals);
        System.out.println("Array contains b? "+strContains);
        strContains = Arrays.stream(strArr).anyMatch("d"::equals);
        System.out.println("Array contains d? "+strContains);
      
        //Long 陣列較特別,要先轉成List再使用stream進行比對
        List<Long> longList = Arrays.asList(longArr);
        boolean longContains = longList.stream().anyMatch(n -> n == 1234567890L);

        System.out.println("Array contains 1234567890L? "+longContains);
        longContains = longList.stream().anyMatch(n -> n == 1L);
        System.out.println("Array contains 1L? "+longContains);
      
        //int 陣列使用IntStream進行比對
        boolean intContains = IntStream.of(intArr).anyMatch(x -> x == 3);
        System.out.println("Array contains 3? "+intContains);
        intContains = IntStream.of(intArr).anyMatch(x -> x == 99);
        System.out.println("Array contains 99? "+intContains);
      
        //double 陣列使用DoubleStream進行比對
        boolean doubleContains = DoubleStream.of(doubleArr).anyMatch(x -> x == 2.02);
        System.out.println("Array contains 2.02? "+doubleContains);
        doubleContains = DoubleStream.of(doubleArr).anyMatch(x -> x == 10.99);
        System.out.println("Array contains 10.99? "+doubleContains);
      
        //若用錯stream無法正確判斷,如對int array誤用Stream
        System.out.println("注意:若用錯stream無法正確判斷,如對int array誤用Stream");
        boolean intWrongContains = Arrays.stream(intArr).anyMatch("3"::equals);
        System.out.println("Array contains 3? "+intWrongContains + ""
                + "(3存在intArr中,使用Arrays.stream皆回傳false,"
                + "應使用前面的IntStream寫法才能正確進行判斷)");
        intWrongContains = Arrays.stream(intArr).anyMatch("99"::equals);
        System.out.println("Array contains 99? "+intWrongContains);
    }
 
線上執行請參考(點選左上角的Execute可看執行結果):http://tpcg.io/zODzm6

執行結果:
Array contains b? true
Array contains d? false
Array contains 1234567890L? true
Array contains 1L? false
Array contains 3? true
Array contains 99? false
Array contains 2.02? true
Array contains 10.99? false
注意:若用錯stream無法正確判斷,如對int array誤用Stream
Array contains 3? false(3存在intArr中,使用Arrays.stream皆回傳false,應使用前面的IntStream寫法才能正確進行判斷)
Array contains 99? false
--------------------------------
參考網址:
  1. How do I determine whether an array contains a particular value in Java?(Stack Overflow) 如何判斷指定元素是否存在Java陣列中
  2. Stream anyMatch() in Java with examples(GeeksforGeeks)
  3. LongStream anyMatch() in Java with examples(GeeksforGeeks)
Copyright © 2019 JavaSparrowK All rights reserved.
版權所有‧謝絕轉載