Course ZJU Open in New Tab

Make the links in courses.zju.edu.cn always open in new tab

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

You will need to install an extension such as Tampermonkey to install this script.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name               Course ZJU Open in New Tab
// @namespace          https://www.cc98.org/user/name/ml98
// @description        Make the links in courses.zju.edu.cn always open in new tab
// @description:zh-CN  让学在浙大首页的链接总是在新标签页中打开
// @version            0.0.1
// @author             ml98
// @license            MIT
// @match              https://courses.zju.edu.cn/user/index
// ==/UserScript==

/* eslint-disable no-undef */

(function() {
    'use strict';
    setInterval(()=>{
        // links
        $('a[ng-href]:not(.__visited_f3641d)').addClass('__visited_f3641d')
          .off('click').attr('target', '_blank');

        // todos
        $('a[ng-click^="openActivity"]:not(.__visited_f3641d)').addClass('__visited_f3641d')
          .off('click').on('click', (e)=>{
            let payload = $(e.target).scope().activity;
            window.open($(e.target).scope().activity.url, '_blank')
        });

        // activities
        $('a[ng-click^="linkToActivity"]:not(.__visited_f3641d)').addClass('__visited_f3641d')
          .off('click').on('click', e=>{
            let payload = $(e.target).scope().n.payload;
            window.open('/course/' + payload.course_id + '/learning-activity#/' + payload.activity_id, '_blank');
        });

        // uploads
        $('.notification-attachment-uploads:not(.__visited_f3641d)').addClass('__visited_f3641d')
          .off('click').on('click', async e=>{
            let n = $(e.target).scope().n;
            if (['web_link', 'slide', 'lesson', 'online_video'].indexOf(n.payload.activity_type) == -1
              && n.payload.uploads.length != 0) {
                let uploads = n.payload.uploads;
                let resp = await Promise.all(uploads.map(upload=>fetch('/api/uploads/reference/document/'
                                                                       + upload.reference_id + '/url?preview=true')));
                let json = await Promise.all(resp.map(res=>res.json()));
                let files = json.map((j,i)=>`<a href="${j.url}">${uploads[i].file_name}</a>`).join('<br>');
                window.open('', '_blank').document.body.outerHTML = files;
            }
        })
    }, 3000);
})();