發表文章

Js- IE不相容 replaceAll 、indexOf、trim 物件不支援屬性或方法 - 解決辦法

Js- IE不相容 replaceAll 、indexOf、trim 物件不支援屬性或方法 - 解決辦法 解決replaceAll 在IE不能使用的問題 解:自己增加replaceAll 加上這段script之後,replaceAll 就可以用了  <script language="javascript" type="text/javascript"> String.prototype.replaceAll = function (FindText,RepText) { regExp = new RegExp(FindText, "g"); return this.replace(regExp,RepText);   } </script> 解決indexOf在IE不能使用的問題 原本使用list.indexOf("a")==-1     解: 改成用jquery裡的$.inArray替代indexOf $.inArray("a", list)==-1 記得 CDN jquery  (點進去可選版本 或是這邊提供1.12版本  <script src="https://code.jquery.com/jquery-1.12.4.js" integrity="sha256-Qw82+bXyGq6MydymqBxNPYTaUXXq7c8v3CwiYwLLNXU=" crossorigin="anonymous"></script> 解決trim在IE不能使用的問題 原本的str.trim() 解:將str.trim()改成下列樣式即可 str.replace(/^\s\s*/, '' ).replace(/\s\s*$/, '' ) 或是像replaceAll 一樣自訂trim  <script language="javascript" type="text/javascript"...

Js - replaceAll - 關鍵字反白/頁面搜索關鍵字/網頁搜尋文字/網頁標記文字

 Js  - replaceAll - 關鍵字反白/頁面搜索關鍵字/網頁搜尋文字/網頁標記文字 var result= new Set(); result.add(1); // [1] result.add(5); // [1, 5] result是要尋找並劃線的關鍵字們 是一個Set var x = document.getElementsByTagName("td"); 先取得網頁中的內容給x td是在網頁中哪個標籤的內容需要被搜尋 可以是<p>也可以是<td>等 第一種寫法      for (var y of result) {          for (var i = 0; i < x.length; i++) {                x[i].innerHTML =x[i].innerHTML.replaceAll(y, "<font style='background-color:#ffdfbf'>" + y + "</font>");      }                      } 透過修改每一個x[i]的html,將有關鍵字的部分做replace加上背景顏色 這邊切記要用replaceAll 不然JS只會改到第一個出現的關鍵字 以上的方法經過實測IE部分版本不支援 IE根據版本不同對JS相容性差異極大 另如:不支援replaceAll 、遍歷Set的of、indexOf、Array.from()、trim()等等等... 把上面這段程式碼改到IE版本皆可用真是燒掉我的腦 因為沒有replaceAll  所以這一段要自己先加上去  <script language="javascript" type="text/javascript"> String.pr...

C# - MSSQL - Transaction 資料庫執行完沒有存入東西 / 命令的Transaction 屬性尚未初始化 /資料庫新增沒反應

C# - MSSQL - Transaction  資料庫執行完沒有存入東西 / 命令的Transaction 屬性尚未初始化 /資料庫新增沒反應  身為一個走應用端的軟體工程師,資料庫只會基本功夫  串串IBM的AS400或是微軟的MSSQL都還算上手  但這次踩到了地雷,主要是修改承接了舊的程式碼 本來就已經有寫入的方法 就直接使用了 public void UpdateAs400Data(string strConnectionString, string strSql){ System.Data.SqlClient.SqlConnection sqlConnection1 = new System.Data.SqlClient.SqlConnection(); sqlConnection1.ConnectionString =strConnectionString; if (sqlConnection1.State.ToString()!= "Open") { sqlConnection1.ConnectionString = strConnectionString; sqlConnection1.Open(); } System.Data.SqlClient.SqlTransaction tn = sqlConnection1.BeginTransaction(); System.Data.SqlClient.SqlCommand sqlCommand1 = new System.Data.SqlClient.SqlCommand(); System.Data.SqlClient.SqlDataAdapter sqlDataAdapter1 = new System.Data.SqlClient.SqlDataAdapter(); sqlCommand1.Connection =sqlConnection1; sqlCommand1.Transaction = tn;     sqlCommand1.CommandText = strSql; try {     int affect...

C# - Linq - DataTable刪除重複項/DataTable調整篩選

C# - Linq - DataTable刪除重複項/DataTable調整篩選  有時候DataTable資料重覆要刪掉 大部分的教學都透過DataTable 轉 DataView 再使用 DataView 的ToTable功能帶True 例如: 有個內容重複的Table1 透過下面兩行即可獲得不重複的Table1   DataView DataView1= Table1.DefaultView; Table1 = DataView1.ToTable(true); 這個做法沒問題,但在資料量大概2萬筆的時候             大概要等1分鐘的處理吧... 慢到哭哭 所以後來改了寫法 透過Linq處理不用一秒 真是很快樂 Table1 = Table1 .AsEnumerable().GroupBy(p => p["姓名"]).SelectMany(p => p.GroupBy(s => s["身分證字號"]).SelectMany(ps => ps.GroupBy(l => l["出生年月"])).Select(x => x.First())).CopyToDataTable<DataRow>(); 這段就是在做將Table1之中 姓名與身分證字號與出生年月都相同的資料,僅保留一份 也就達成了不重複資料! 外加如果要根據某列的結果篩選出新的Table可以這樣寫 Table1 = Table1 .AsEnumerable().Where(q => q.Field<string>("性別") != "F").CopyToDataTable<DataRow>(); 這段是會篩選出列名稱[性別]中的資料不為F的列 快樂提升效能吧XD

Html - Css -Js - 控制video按鈕 - 隱藏Video控制項 /鎖住控制項 - 自動播放影片 / 鎖住影片按鈕 / 鎖住影片進度條

圖片
 Html - Css -Js - 控制video按鈕 / 隱藏Video控制項 /鎖住控制項 / 自動播放影片 / 鎖住影片按鈕 / 鎖住影片進度條   為了強迫使用者看影片,不可以直接拉動進度條到最後 所以決定關掉進度條 這個部分踩了一身雷WOW 因為基本的控鍵隱藏 只要Video的controls="controls"拿掉就好 原本的程式這樣會顯示播放與進度條等等 <video width="1024" height="576" id="shVideo" controls="controls">     <source src="mp4連結" type="video/mp4" > </video> 拿掉的這樣 <video width="1024" height="576" id="shVideo">     <source src="mp4連結" type="video/mp4" > </video> 就不會顯示了 But!! 偉大的Chrome可以在影片點右鍵開啟控制介面 這樣有個毛線用,只能擋掉笨的使用者(喂 於是我再加上了Css強制隱藏video的控制介面 <style type="text/css">     video::-webkit-media-controls-timeline {     display: none; } video::-webkit-media-controls {        display: none; }  .auto-style1 {      text-align: center;     }  </style> 這一次即使偉大如Chrome都開不起來了哈哈哈 但更可怕的事情發生了 因為沒有按鈕了,所以影片需要自動播放 然後Chrome現在禁止有聲音的影片自動播放 要就要把影片禁音...不然就是要透過紐 於是 我決定直接用Js刻暫停跟播放的按鈕... 這樣至少比...

Js - C# - ASP.NET - Js呼叫後端 - Js調用C# / Js呼叫C#方法

 Js - C# - ASP.NET - Js呼叫後端 / Js調用C# / Js呼叫C#方法 在Asp.net中,我用Js做了一個影片監控,需要在影片播完後,呼叫後端的C#方法 網路上找了很多 目前成功率100%不會出問題的方法只有 建立一個看不到的按鈕連結C# 然後用Js去按按鈕 XD Asp.net前端如下 在body標籤內 <form id="form1" runat="server"> <div style="height:600px;width:100%"> <iframe id="frame1" name="mp" scrolling="auto" style="height:600px;width:100%" runat="server" src="xxx.html"></iframe> </div> <div style="visibility:hidden"> <asp:Button ID="Button2" runat="server" onclick="Button2_Click" /> </div> </form> <script type="text/javascript" > window.onload = function () { var md =window.frames["mp"].document.getElementsByTagName("video")[0]; md.addEventListener("ended",function () { alert("播放结束"); document...

Asp.net - Js - 取得 iframe 中影片播完 - 取得iframe 中的元素/ 取得iframe 中html 的影片

Asp.net - Js - 取得 iframe 中影片播完/取得iframe 中的元素/ 取得iframe 中html 的影片 一段Asp.net引入iframe的程式如下 <div style="height:600px;width:100%">     <iframe id="frame1" name="mp" scrolling="auto" style="height:600px;width:100%" runat="server" src="內有video的html連結(結尾是.html喔)" ></iframe>  <div> 現在我要在這個頁面取得内鑲嵌的html的video播完沒 播完了我要呼叫後端方法 要看html的video播放程式請參考這篇 js如下 <script type="text/javascript" >   window.onload = function () { var md =window.frames["mp"].document.getElementsByTagName("video")[0]; md.addEventListener("ended", function () {      alert("播放结束");              })      }     </script> 如此便可在此頁面取得iframe 內的影片是否播放完畢

Asp.net - Html - Js - 影片播放 - 影片播完/監聽影片播完/播放完影片/video播完

Asp.net - Html - Js - 影片播放/影片播完/監聽影片播完/播放完影片/video播完 最近接到一個需求需要監看每個帳號有沒有乖乖把影片看完XDDD 因為目前專案的寫法是打開影片就紀錄這個帳號看過 但並不是看完 所以希望我可以調整成,影片播放完畢才是看過 嗯...雖然我也表示過,人開影片開著沒有看但跑完了,也是沒看www...防君子不防小人阿 雖然大家都知道這件事情 但還是要寫 我拿到的就是Asp.net的專案 先來講純粹的Html如何達成 當然用Js囉 <video width="1024" height="576" id="shVideo" controls="controls"> <source src="影片路徑及檔名" type="video/mp4"> </video> <script>     var md=document.getElementsByTagName("video")[0];     md.addEventListener("ended",function(){          alert("播放结束");     }) </script> 這段Html執行後會跳出視窗顯示播放完成 所以有需要播放完後執行甚麼程式就塞在方法裡即可 基本上這段在Asp.net前端的結果應該是一樣的 但我剛好遇到的影片是在html 然後Asp前端用iframe導入該html 影片播完之後要調用的是Asp後端的程式... 所以有了這一篇 Asp 取得 iframe 中影片播完

ASP.NET - C# - (解決) Asp.net 中 Console.WriteLine() 不起作用 輸出無效 沒輸出資料 

Asp.net - C# - Console.WriteLine() 不起作用 輸出無效 沒輸出資料 身為一個平常只寫C# 根本沒寫過Asp.net 卻總是接到Asp.net修改或直接新的專案 不免還是會想要把想看的資料輸出在畫面上 有的時候靠Debug一個一個看太慢 無腦的就寫了 Console.WriteLine(變數) 然後就快樂的發現 即使 VS開啟「檢視」中 「輸出」的視窗 執行程式還是看不到輸出~ 上網爬了一遍才知道 在Asp.net中必須要寫 System.Diagnostics.Debug.WriteLine()  而不是 Console.WriteLine() 換成 System.Diagnostics.Debug.WriteLine(變數) 如此一來「輸出」的視窗就會顯示了~~~

C# - DataTable to Excel - DataTable轉Excel/DataTable輸出Excel DataSet

C# - DataTable to Excel - DataTable轉Excel/DataTable輸出Excel DataSet  DataTable/DataSet直接輸出成Excel 這邊有使用NPOI,記得要裝 如果用新版的VS2019開發會自動提示可以一鍵安裝 using NPOI; using NPOI.SS.UserModel; using NPOI.HSSF.UserModel; 方法給大家直接套  DataTable             public void DataTableToExcelFile(DataTable dt)         {                            IWorkbook wb = new HSSFWorkbook();             ISheet ws;             //IWorkbook wb = new XSSFWorkbook();             //ISheet ws;這邊自行選擇要新版或舊版的excel,記得改了的話下面輸出副檔名也要改                                          if (dt.TableName != string.Empty) { ws = wb.CreateSheet(dt.TableName); ...

C# - dict轉成DataTable / 字典轉DataTable /dict to DataTable

C# - dict轉成DataTable / 字典轉DataTable /dict to DataTable  dicSubData是一個自行設定的字典變數 先建立DataTable 這邊因為程式簡單,為了方便就直接使用static, 若程式架構需要考慮耦合請自行改寫 Static DataTable dtData = new DataTable(); 要轉成DataTable 首先需要填入DataTable 的Columns 這邊就用dicSubData的Key來填                  foreach (var colName in dicSubData.Keys)               {                                             dtData .Columns.Add(colName, typeof(string));                                     }                     DicToTable(dicSub Data ,  dtData  ); 填完Columns之後再來就是要把全部字典內容丟進去 寫了一個方法          public static void DicToTable(Dictionary<str...

C# - json轉字典 - 取得字典中的陣列再轉字典/解析字典內容 / json to dict

C# - json轉字典/取得字典中的陣列再轉字典/解析字典內容/ json to dict  由於C#不能像python一樣 即使json轉成dict之後內含list 也可以直接使用for迴圈遍歷一層一層 或是直接透過dict[key][index]這種語法取得list的內容 為了取得子資料轉成DataTable 想了解法 假設json取得資料如下 { "code":"0","message":"Success","ans": [ {"code":"1","Test": [           {"Num":"107","Age":"50","Fit":"C"},{"Num":"107","Age":"40","Fit":"C"}                             ]                     },{"code":"12","Test2": [ {"Num":"108","Age":"60","Fit":"CH"}                             ]                         }           ] } 就是dict->list->dict->list->dict 網路上找不到甚麼優良漂亮的解法 所以我就真的不管,照著這個邏輯寫下去了XD 根據上一篇透過webapi接收json的最後一行   Dictionary<string, object> dicJson = JsonTo...

C# - WebApi - 串接WebApi帶key帶header帶body - 傳值帶鍵值 / 回傳josn轉字典

C# - 串接WebApi帶key帶header帶body / 傳值帶鍵值 / 回傳josn轉字典  一直以來都沒用過C#做這一塊資料的接收 因為用python實在太方便 剛好最近在公司用到C#做串接 發現自己連怎麼帶key都不會哈哈哈... 整個研究完之後就記錄起來分享 假設對方要求的格式如下: 呼叫時請加入Header Content-Type: Application/Json api-key: 123 傳入值範例 { "Alable":"2020", "Blable":"test",     "Clable":"1", } 以下程式碼是 發出post請求 帶ContentType,Headers                using Newtonsoft.Json;                string url = "API連結";             string key = "要帶的key";             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);             request.Method = "POST";             request.ContentType = "Application/Json";             request.Headers.Add("api-key", key);             var postData =             ...

C# -ArrayList - Random-打亂陣列/亂數不重複/亂數陣列

C# -ArrayList - Random-打亂陣列/亂數不重複/亂數陣列 此篇不是撲克牌洗牌法,因為使用上覺得效能與結果都不是很好, 撲克牌洗牌一次換兩個,陣列大的時候換了感覺得沒有很乾淨。 所以自己找了另一個方式,打亂陣列的順序。 這個方式是透過 ArrayList 的特性與 Random 。 此範例會令產生一個新的陣列,若要變回原陣列名稱請自行加程式。 邏輯說明 ArrayList 是可動態增減陣列範圍 透過這樣的方式每次隨機Random 一個index 按照這個index在ArrayList取值另存給新的陣列後將該值從ArrayList中刪掉。 則得到的新陣列是原來陣列的打亂。 程式碼 static ArrayList list = new ArrayList(); static String[] Test = new String[10000]; static String[] NewTest = new String[10000]; for (int i = 1; i < 10001; i++) { Test[i]=i.ToString();//先創造原始字串陣列1~10000 } for (int i = 0; i < 10000; i++) { list.Add(i); }//這邊先創造一個ArrayList list 把原始陣列Test的內容都加進去 //即你原始陣列長度有多少,這個list就要有多少 for (int i = 0; i < 10000; i++) { Random Rnd = new Random(); //必須先new Random int r = Rnd.Next(0, list.Count); NewTest[i] = Test[(int)list[r]];//list 是一個物件型別需轉成int,並將list隨機index的值存給NewTest list.RemoveAt(r);//將list這個index的值刪除 } for (int i = 0; i < 10000; i++) { Console.Write(NewTest[i]); //Test是原...

ASP.NET- JS - 按住shift多選打勾 checkBox- Shift多選打勾checkBox - ASP+JAVASCRIPT

按住shift一次可多勾選checkBox的功能在純前端非常常見 無奈遇到的系統是Asp.net 前端的checkBox是由後端撈資料庫動態產生的 所以必須將js結合asp才能夠實現這個功能 網路上都找不到相關的程式碼 只好自己手刻 這邊就分享程式碼 checkBox動態產生 先打勾一個 按住Shift 再按另一個checkBox 則中間checkBox都會被勾選(若已勾選的則取消勾選) 全程式皆為js 請貼在aspx前端頁面並且建議在checkbox之後 注意 動態物件產生的id前面都會相同,最後則是數字遞增 所以程式碼中「 動態物件產生的id 」指的是數字之前的字串 例如動態產生的物件id為 abc_0、abc_1、abc_2 則程式碼中"動態物件產生的id" 請填入 "abc_" 程式碼 <script type="text/javascript">               var shiftON = false; //儲存shift是否被按下 var IDs = new Array(); //紀錄開始或結束的checkboxID var IDe = new Array(); //紀錄開始或結束的checkboxID var IDs; var IDe; //判斷鍵盤點選 window.document.onkeydown = OnBodyKeyDow; //判斷鍵盤放開 window.document.onkeyup = OnBodyKeyDowNO; // window.οnlοad = OnBodyKeyDo; //判斷shift是否按下 shift代號為16 function OnBodyKeyDow() { if ((window.event....

Python-selenium - 輸入文字/輸入帳號密碼/textbox

圖片
  使用selenium輸入帳號密碼或是在對話框輸入內容 範例使用Google首頁,在搜尋欄打上Python 首先取得搜尋欄位xpath 若不會找xpath 請點我

Python-selenium - 下拉式選單 - 選擇選單 - 下拉選擇

圖片
利用selenium 選擇下拉式選單 需要另外引入Select套件 範例使用中央氣象局網站  https://www.cwb.gov.tw/V8/C/ 目標將下圖「選擇鄉鎮」的下拉選單,選到松山區

Python-selenium - 切換分頁視窗 - 點選分頁視窗/瀏覽器分頁/瀏覽器視窗

當瀏覽器的分頁不只一個 想點選分頁的時候或是到另一個分頁取得資料時 我們需要做切換視窗的動作 程式碼  driver.switch_to_window(browser.window_handles[1]) #browser.window_handles[1] 數字1指的是index 看你需要的是第幾個視窗

Python-selenium - frame - 轉移至frame - 尋找frame中的物件、頁面元素

如若網站結構中有使用 frame 則可能無法直接透過find_element找到需要的頁面元素 此時須先將driver轉換到frame之中 利用driver.switch_to.frame() 程式碼 driver.switch_to.frame(browser.find_element_by_xpath('frame的xpath')) 若不會找xpath 請點我 Python-selenium - 滑鼠點選/點擊/雙擊 - 實現網站自動化(瀏覽器自動化) 模擬人為操作

Python-selenium - 錯誤 - Error -NoSuchElementException解決/處理

當出現 NoSuchElementException 錯誤時 Message: no such element: Unable to locate element 如果自己找不到程式中的問題,也確認頁面標籤是對的 可能是因為網頁還是未載入完成,但程式已先行尋找 建議在程式碼中import time 並在載入頁面時使用time.sleep(請輸入秒數) 例如隔兩秒切換分頁可以這樣寫   browser.switch_to_window(browser.window_handles[1])   time.sleep(2)   browser.switch_to_window(browser.window_handles[0]) time.sleep(2)