GVKun编程网logo

javascript – 如何首次检测用户登录,首次加载特定页面?(js判断第一次进页面)

4

对于想了解javascript–如何首次检测用户登录,首次加载特定页面?的读者,本文将是一篇不可错过的文章,我们将详细介绍js判断第一次进页面,并且为您提供关于AndroidWebview和Javas

对于想了解javascript – 如何首次检测用户登录,首次加载特定页面?的读者,本文将是一篇不可错过的文章,我们将详细介绍js判断第一次进页面,并且为您提供关于Android Webview 和 Javascript 交互,实现 Android 和 JavaScript 相互调用、href=“javascript:”vs href=“javascript:void(0)”、JavaScript - 基础入门.0002.JavaScript 快速使用、JavaScript .prototype 如何工作? - How does JavaScript .prototype work?的有价值信息。

本文目录一览:

javascript – 如何首次检测用户登录,首次加载特定页面?(js判断第一次进页面)

javascript – 如何首次检测用户登录,首次加载特定页面?(js判断第一次进页面)

我想仅在用户第一次登录时触发一些JS,只有第一次加载特定页面.

我相信我可以第一次登录,只需检查user.sign_in_count< 2,但是我不知道如何仅在第一页上加载加载. 即我不想在用户第一次登录后触发JS,并刷新页面而不注销. 我使用Turbolinks和$(document).on(‘turbolinks:load’,function(){来触发它. 编辑1 所以我想做的是在许多页面上执行Bootstrap Tour.但是我只希望自动执行该游览,在第一页加载.旅游本身将引导用户访问我的应用程序中的其他特定页面,但是每个页面都将在每个页面上都有页面特定的浏览JS.

现在,在我的HTML中我有这样的东西:

<script type="text/javascript">
  $(document).on('turbolinks:load',function() {
      var tour = new Tour({
        storage: false,backdrop: true,onStart: function(){
        $('body').addClass('is-touring');
        },onEnd: function(){
        $('body').removeClass('is-touring');
        },steps: [
        {
          element: "#navbar-logo",title: "Go Home",content: "All throughout the app,you can click our logo to get back to the main page."
        },{
          element: "input#top-search",title: "Search",content: "Here you can search for players by their name,school,positions & bib color (that they wore in our tournament)"
        }
      ]});

      // Initialize the tour
      tour.init();

      // Start the tour
      tour.start();
  });
</script>

所以我真的想做的是:

>在他们重新加载页面时,不要在第一次登录时执行新的游览来轰炸用户.
>允许他们能够通过简单的按一下链接,在以后通过手动执行旅游.
>我不想在我的数据库中存储任何东西,如果我不必 – 所以最好这应该是一个基于cookie的方法或localStorage
>假设我将使用Rails跟踪他们已经完成的登录数量.所以一旦他们登录不止一次,我就不能触发这个JS.

真正的问题是在第一次登录之前,如果他们刷新主页10次,那么这个游览会被执行10次.这就是我想阻止的.

我希望能够提供一些更加清晰的内容.

解决方法

前言

这是我的理解,你有:

>包含单个旅游的多个页面(每页的旅游都不同)
>一种检测首次登录到帐户的方法(ruby login count)
>根据第一次登录添加脚本值的能力

解决方案概述

以下解决方案使用localStorage来存储每个旅游标识符的关键值对,以及是否已被看到. localStorage在页面刷新和会话之间依然存在,顾名思义,localStorage对于每个域,设备和浏览器都是唯一的(即chrome的localStorage不能访问firefox的本地存储,即使是在同一个域中,也不能在您的笔记本电脑上使用chrome的localStorage访问chrome的localStorage您的手机即使在同一个域).我提出这个,以说明依赖前言3切换JS标志,如果用户以前登录过.

要启动巡视,代码检查localStorage是否对应的键值对未设置为true(表示已被看到).如果确实存在并被设置为true,则巡视不会启动,否则运行.当每个巡视开始时,使用其onStart方法,我们更新/添加巡视的标识符到localStorage并将其值设置为true.

如果您只想执行当前页面的巡视,可以通过手动调用巡视开始方法进行手动执行,否则可以清除与巡视相关的所有localStorage,并将用户发回第一个page /如果你在第一页,再次调用start方法.

JSFiddle(基于HTML所提出的关于旅游的其他问题)

HTML(这可以是具有id =“tourAgain”属性的任何元素,以便以下代码生效.

<buttonid="tourAgain">Take Tour Again</button>

JS

var isFirstLogin = true; // this value is populated by ruby based upon first login
var userID = 12345; // this value is populated by ruby based upon current_user.id,change this value to reset localStorage if isFirstLogin is true
// jquery on ready function
$(function() {
    var $els = {};  // storage for our jQuery elements
    var tour; // variable that will become our tour
    var tourLocalStorage = JSON.parse(localStorage.getItem('myTour')) || {};

    function activate(){
        populateEls();
        setupTour();
        $els.tourAgain.on('click',tourAgain);
        // only check check if we should start the tour if this is the first time we've logged in
        if(isFirstLogin){
            // if we have a stored userID and its different from the one passed to us from ruby
            if(typeof tourLocalStorage.userID !== "undefined" && tourLocalStorage.userID !== userID){
                // reset the localStorage
                localStorage.removeItem('myTour');
                tourLocalStorage = {};
            }else if(typeof tourLocalStorage.userID === "undefined"){ // if we dont have a userID set,set it and save it to localStorage
                tourLocalStorage.userID = userID;
                localStorage.setItem('myTour',JSON.stringify(tourLocalStorage));
            }
            checkShouldStartTour();
        }
    }

    // helper function that creates a cache of our jQuery elements for faster lookup and less DOM traversal
    function populateEls(){
        $els.body = $('body');
        $els.document = $(document);
        $els.tourAgain = $('#tourAgain');
    }

    // creates and initialises a new tour
    function setupTour(){
        tour = new Tour({
            name: 'homepage',// unique identifier for each tour (used as key in localStorage)
            storage: false,onStart: function() {
                tourHasBeenSeen(this.name);
                $els.body.addClass('is-touring');
            },onEnd: function() {
                console.log('ending tour');
                $els.body.removeClass('is-touring');
            },steps: [{
                element: "div.navbar-header img.navbar-brand",content: "Go home to the main page."
            },{
                element: "div.navbar-header input#top-search",positions & bib color (that they wore in our tournament)"
            },{
                element: "span.num-players",title: "Number of Players",content: "This is the number of players that are in our database for this Tournament"
            },{
                element: '#page-wrapper div.contact-Box.profile-24',title: "Player Info",content: "Here we have a quick snapshot of the player stats"
            }]
        });
        // Initialize the tour
        tour.init();
    }

    // function that checks if the current tour has already been taken,and starts it if not
    function checkShouldStartTour(){
        var tourName = tour._options.name;
        if(typeof tourLocalStorage[tourName] !== "undefined" && tourLocalStorage[tourName] === true){
            // if we have detected that the tour has already been taken,short circuit
            console.log('tour detected as having started prevIoUsly');
            return;
        }else{
            console.log('tour starting');
            tour.start();
        }
    }

    // updates localStorage with the current tour's name to have a true value
    function tourHasBeenSeen(key){
        tourLocalStorage[key] = true;
        localStorage.setItem('myTour',JSON.stringify(tourLocalStorage));
    }

    function tourAgain(){
        // if you want to tour multiple pages again,clear our localStorage 
        localStorage.removeItem('myTour');
        // and if this is the first part of the tour,just continue below otherwise,send the user to the first page instead of using the function below
        // if you just want to tour this page again just do the following line
        tour.start();
    }

    activate();
});

PS.我们没有使用onEnd触发tourHasBeenSeen函数的原因是,当前有一个引导浏览的bug,如果最后一步的元素不存在,则游程结束而不触发onEnd回调BUG.

Android Webview 和 Javascript 交互,实现 Android 和 JavaScript 相互调用

Android Webview 和 Javascript 交互,实现 Android 和 JavaScript 相互调用

在 Android 的开发过程中、遇到一个新需求、那就是让 Java 代码和 Javascript 代码进行交互、在 IOS 中实现起来很麻烦、而在 Android 中相对来说容易多了、Android 对这种交互进行了很好的封装、我们可以很简单的用 Java 代码调用 WebView 中的 js 函数、也可以用 WebView 中的 js 来调用 Android 应用中的 Java 代码。

案例主要包含了:

  1.  Html 中调用 Android 方法
  2. Android 调用 JS 方法无参数
  3. Android 调用 JS 方法有参数
  4. Android 调用 JS 方法有参数且有返回值处理方式 1
  5. Android 调用 JS 方法有参数且有返回值处理方式 2(Android4.4 以上)

1:创建 JS 对象

webView.addJavascriptInterface(new JsInterface(), "obj");
public class JsInterface {
	//JS中调用Android中的方法 和返回值处理的一种方法
		
	/****
          * Html中的点击事件 onclick
	  *  <input type="button" value="结算" onclick="showToast(''12'')">
	  * @param toast
	  */
	@JavascriptInterface
	public void showToast(String toast) {
	  Toast.makeText(MainActivity.this, "你的商品价格是:¥"+toast, Toast.LENGTH_SHORT).show();
	}
}
 function showToast(toast) { 
	var money=toast*3;
	javascript:obj.showToast(money);
}

2:

webView.loadUrl("javascript:funFromjs()");
function funFromjs(){
    document.getElementById("helloweb").innerHTML="div显示数据,无参数";
}

3:

webView.loadUrl("javascript:funJs(''Android端传入的信息,div标签中显示,含参数'')");
function funJs(msg){
   document.getElementById("hello2").innerHTML=msg;
}

4: 

webView.loadUrl("javascript:sum(6,6)");
/***
 * Android代码调用获取J是中的返回值
 * 
 * @param result
*/
   @JavascriptInterface
   public void onSum(int result) { 
	Toast.makeText(MainActivity.this, "Android调用JS方法且有返回值+计算结果=="+result, Toast.LENGTH_SHORT).show();
   } 
function sum(i,m){ 
    var result = i*m; 
    document.getElementById("h").innerHTML= "Android调用JS方法且有返回值--计算结果="+result; 
    javascript:obj.onSum(result) 
} 

5:

 webView.evaluateJavascript("sumn(6,11)", new ValueCallback<String>() {
         @Override
	 public void onReceiveValue(String value) {
	     Toast.makeText(MainActivity.this, "返回值"+value, Toast.LENGTH_SHORT).show();
           }
});
function sumn(i,m){ 
     var result = i*m; 
     document.getElementById("hh").innerHTML= "Android调用JS方法且有返回值--计算结果="+result; 
     return result;
} 

   注意:

1、Java 调用 js 里面的函数、效率并不是很高、估计要 200ms 左右吧、做交互性很强的事情、这种速度很难让人接受、而 js 去调 Java 的方法、速度很快、50ms 左右、所以尽量用 js 调用 Java 方法

2、Java 调用 js 的函数、没有返回值、调用了就控制不到了

3、Js 调用 Java 的方法、返回值如果是字符串、你会发现这个字符串是 native 的、转成 locale 的才能正常使用、使用 toLocaleString () 函数就可以了、不过这个函数的速度并不快、转化的字符串如果很多、将会很耗费时间

4、网页中尽量不要使用 jQuery、执行起来需要 5-6 秒、最好使用原生的 js 写业务脚本、以提升加载速度、改善用户体验。

注:使用的是本地的 Html 文件,不过在网络链接的 Html 文件也是可以实现的。   

源码点击下载

href=“javascript:”vs href=“javascript:void(0)”

href=“javascript:”vs href=“javascript:void(0)”

##href=“javascript:” vs href=“javascript:void(0)”

可参考
http://www.jb51.net/article/37904.htm
http://stackoverflow.com/questions/3666683/href-javascript-vs-href-javascriptvoid0

JavaScript - 基础入门.0002.JavaScript 快速使用

JavaScript - 基础入门.0002.JavaScript 快速使用

常用属性:

属性名称 属性说明
src 表示包含要执行代码的外部文件,常用来引用外部的 js 文件
type 表示代码使用的脚本语言的内容类型

1

2

3

4

5

6

7

8

9

10

11

12

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>]</title>

</head>

<body>

    <script type="text/javascript">

        alert(''Hello Word!'');

    </script>

</body>

</html>

 

注意事项:

1. 如果你想弹出一个 </script> 标签的字符串,内部 js 会误解成 Js 代码的结束,可通过 + 连接分解 </script > 将字符串分为两个部分,但是外部引用的 js 是无需加号拼接的

1

2

3

4

5

6

7

8

9

10

11

12

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title></title>

</head>

<body>

    <script type="text/javascript">

        alert(''</scr'' ''ipt>'');

    </script>

</body>

</html>

2. Js 代码越来越庞大时,最好把它另存为一个.js 文件,通过 src 来引用,这样具有维护性高,可缓存 (加载一次,无需加载), 方便未来扩展的特点

1

2

3

4

5

6

7

8

9

10

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title></title>

</head>

<body>

    <script type="text/javascript" src="js/main.js"></script>

</body>

</html>

3. 对于不支持 JavaScript 平稳的处理方式是通过 <noscript></noscript > 实现?

1

2

3

4

5

6

7

8

9

10

11

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title></title>

<noscript>此网站必须启用JavaScript支持!</noscript>

</head>

<body>

    <script type="text/javascript" src="js/main.js"></script>

</body>

</html>

 

 

登录乐搏学院官网 http://www.learnbo.com/

或关注我们的官方微博微信,还有更多惊喜哦~

 

 

本文出自 “满满李 - 运维开发之路” 博客,请务必保留此出处 http://xmdevops.blog.51cto.com/11144840/1846116

JavaScript .prototype 如何工作? - How does JavaScript .prototype work?

JavaScript .prototype 如何工作? - How does JavaScript .prototype work?

问题:

I''m not that into dynamic programming languages but I''ve written my fair share of JavaScript code. 我不喜欢动态编程语言,但是我写了相当一部分 JavaScript 代码。 I never really got my head around this prototype-based programming, does any one know how this works? 我从来没有真正了解过这种基于原型的编程,有人知道它是如何工作的吗?

var obj = new Object();
obj.prototype.test = function() { alert(''Hello?''); };
var obj2 = new obj();
obj2.test();

I remember a lot discussion I had with people a while back (I''m not exactly sure what I''m doing) but as I understand it, there''s no concept of a class. 我记得很久以前与人们进行过多次讨论(我不确定自己在做什么),但是据我了解,这里没有一个课堂的概念。 It''s just an object, and instances of those objects are clones of the original, right? 这只是一个对象,这些对象的实例是原始对象的副本,对吗?

But what is the exact purpose of this ".prototype" property in JavaScript? 但是,此 “.prototype” 属性在 JavaScript 中的确切目的是什么? How does it relate to instantiating objects? 它与实例化对象有何关系?

Update: correct way 更新:正确的方法

var obj = new Object(); // not a functional object
obj.prototype.test = function() { alert(''Hello?''); }; // this is wrong!

function MyObject() {} // a first class functional object
MyObject.prototype.test = function() { alert(''OK''); } // OK

Also these slides really helped a lot. 这些幻灯片也确实起到了很大作用。


解决方案:

参考一: https://stackoom.com/question/2P2H/JavaScript-prototype 如何工作
参考二: https://oldbug.net/q/2P2H/How-does-JavaScript-prototype-work

我们今天的关于javascript – 如何首次检测用户登录,首次加载特定页面?js判断第一次进页面的分享已经告一段落,感谢您的关注,如果您想了解更多关于Android Webview 和 Javascript 交互,实现 Android 和 JavaScript 相互调用、href=“javascript:”vs href=“javascript:void(0)”、JavaScript - 基础入门.0002.JavaScript 快速使用、JavaScript .prototype 如何工作? - How does JavaScript .prototype work?的相关信息,请在本站查询。

本文标签: