обратный вызов javascript веб-браузера wpf

#javascript #c# #jquery #wpf

#javascript #c# #jquery #wpf

Вопрос:

если у вас есть javascript:

 function calculateValues(callback)
        {

            window.external.getHistoryRange(0,1,"",function(res){
                var hist = eval(res);
                histCount = hist.historyCount;
                hist = hist.historyContent;
                if (histCount == 0)
                {
                    return;
                }
                $("#history_table").show();
                var $row = addAlertHistoryRow(hist[0]);
                var rowHeight = $row.height();
                pageItemsCount = Math.floor(contentHeight / rowHeight);
                curPageNum = 0;
                $row.remove();

                if (callback) callback();
            });


        }
  

в функции calculateValues(обратный вызов) параметр обратного вызова равен:

 function(){statItempos = 0; gethistoryandshow(pageNum,startItemsPos,callback);}
  

и код c #, который работает с этим скриптом (ObjectForScripting):

 public string getHistoryRange(string strVar0 = "", string strVar1 = "", string strVar2 = "", string strVar3 = "")
        {
            string res = "";
            using (DeskAlertsDbContext db = new DeskAlertsDbContext())
            {

                var alerts = db.HistoryAlerts.OrderBy(a => a.ReciveTime)
                    .Include(b => b.alert.WINDOW)
                    .ToList();
                foreach (var alert in alerts)
                {

                    res  = ("{"id":"   System.Web.HttpUtility.JavaScriptStringEncode(alert.alert.Alert_id)  
                            ","date":""  
                            System.Web.HttpUtility.JavaScriptStringEncode(
                                alert.ReciveTime.ToString(CultureInfo.InvariantCulture))   "","alert":""  
                            System.Web.HttpUtility.JavaScriptStringEncode(alert.alerttext)   "","title":""  
                            System.Web.HttpUtility.JavaScriptStringEncode(alert.alert.Title)   "","acknow":""  
                            System.Web.HttpUtility.JavaScriptStringEncode(alert.alert.Acknown)   "","create":""  
                            System.Web.HttpUtility.JavaScriptStringEncode(alert.alert.Create_date)   "","class":""  
                            "1"   "","urgent":""   System.Web.HttpUtility.JavaScriptStringEncode(alert.alert.Urgent)  
                            "","unread":""   Convert.ToInt32(alert.isclosed).ToString()   "","position":""  
                            System.Web.HttpUtility.JavaScriptStringEncode(alert.alert.Position)   "","ticker":""  
                            alert.alert.Ticker   "","to_date":""  
                            System.Web.HttpUtility.JavaScriptStringEncode(alert.alert.To_date)   ""},");
                }

                res = res.TrimEnd(','); //trim right ","
                res = "({"historyCount":"   alerts.Count.ToString()   ","historyContent":["   res   "]});";

                Browserwindow.Wb.InvokeScript("eval", new object[] { strVar3 });
                Browserwindow.Wb.InvokeScript("CallbackFunction", new object[] { res });

                return res;
            }

        }
  

В строке: « Browserwindow.Wb.InvokeScript("eval", new object[] { strVar3 }); »
Я пытаюсь вызвать анонимную функцию из javascript и получаю сообщение об ошибке.

Вопрос в том, как сделать эту логику. Как выполнить функцию JS из параметров другой функции. А затем продолжить JS. Если я попытался присвоить имя функции и вызвать ее, функция работает, но глобальный контекст ( if (callback) callback(); ) становится недоступным

Ответ №1:

Ваше имя функции обратного вызова неверно.

Заменить

 Browserwindow.Wb.InvokeScript("CallbackFunction", new object[] { res });
  

С

 Browserwindow.Wb.InvokeScript("calculateValues", new object[] { res });
  

Комментарии:

1. Спасибо за ваш ответ. Все правильно. Функция обратного вызова — это другая функция из js. Ответил сам.

Ответ №2:

Хммм… Просто сделал мою переменную динамической (не строковой), и все заработало

 public string getHistoryRange(string strVar0 = "", string strVar1 = "", string strVar2 = "", dynamic strVar3 = null)
        {
            string res = "";
            using (DeskAlertsDbContext db = new DeskAlertsDbContext())
            {

                var alerts = db.HistoryAlerts.OrderBy(a => a.ReciveTime)
                    .Include(b => b.alert.WINDOW)
                    .ToList();
                foreach (var alert in alerts)
                {

                    res  = ("{"id":"   System.Web.HttpUtility.JavaScriptStringEncode(alert.alert.Alert_id)  
                            ","date":""  
                            System.Web.HttpUtility.JavaScriptStringEncode(
                                alert.ReciveTime.ToString(CultureInfo.InvariantCulture))   "","alert":""  
                            System.Web.HttpUtility.JavaScriptStringEncode(alert.alerttext)   "","title":""  
                            System.Web.HttpUtility.JavaScriptStringEncode(alert.alert.Title)   "","acknow":""  
                            System.Web.HttpUtility.JavaScriptStringEncode(alert.alert.Acknown)   "","create":""  
                            System.Web.HttpUtility.JavaScriptStringEncode(alert.alert.Create_date)   "","class":""  
                            "1"   "","urgent":""   System.Web.HttpUtility.JavaScriptStringEncode(alert.alert.Urgent)  
                            "","unread":""   Convert.ToInt32(alert.isclosed).ToString()   "","position":""  
                            System.Web.HttpUtility.JavaScriptStringEncode(alert.alert.Position)   "","ticker":""  
                            alert.alert.Ticker   "","to_date":""  
                            System.Web.HttpUtility.JavaScriptStringEncode(alert.alert.To_date)   ""},");
                }

                res = res.TrimEnd(','); //trim right ","
                res = "({"historyCount":"   alerts.Count.ToString()   ","historyContent":["   res   "]});";

                dynamic variable = Browserwindow.Wb.InvokeScript("eval", new object[] { strVar3 });
                variable(res);

                return res;
            }

        }